Elaine94 Ответов: 2

Объединить два SQL select


привет. у меня проблема. у меня есть база данных, и в моей базе данных есть несколько таблиц. проблема в том, что я хочу объединить категорию таблицы и проект таблицы. категория таблицы получила идентификатор категории и имя категории, в то время как проект таблицы получил много столбцов, но столбец, который я хочу выбрать, - это идентификатор проекта, Имя пользователя и идентификатор категории. поэтому я хочу выбрать идентификатор и имя категории из таблицы категорий и выбрать идентификатор проекта, Имя пользователя, идентификатор категории из таблицы проектов. это означает, что я хочу отобразить количество имен каждой категории на основе имени пользователя.

прямо сейчас я уже получил общее количество проектов для каждого имени категории в таблице категорий. но теперь проблема, с которой я столкнулся, заключается в том, что когда я добавил условие where (where username = '013'), оно не отображало всю сумму каждого имени категории. я хочу, чтобы он отображал все общее имя каждой категории, когда имя пользователя равно 013.

this is my category table:

	id	cat_name
	1	New Project
	2	Uncategorized Project
	3	This year
	4	Next year
	5	Tender
	6	PO in
	7	Lost
	8	Follow Up Project
	9	Completed

then, here is my project table:

	id	Project_name	username	cat_id	
	1	KLCC	          013	      3			
	2	jelutong          013	      3	
	3	seri apartment	  013	      4			
	4	seri condo	      013         1	
															

so, the result that i want for username 013 are like this.

<pre>	id	cat_name	         count
	1	New Project	               2
	2	Uncategorized Project      2
	3	This year	               2
	4	Next year	               2
	5	Tender	                   1
    6   PO In                      0
    7   Lost                       0


Что я уже пробовал:

вот команда sql, которую я создал

SELECT c.id, c.cat_name, COUNT(p.id) as count
FROM asuwaris.category c
LEFT JOIN asuwaris.project p ON c.id = p.cat_id
where p.username = '013'
GROUP BY c.cat_name
ORDER BY c.id;

0x01AA

Трудно помочь, но я думаю, что что-то вроде этого должно сделать эту работу:
ВЫБИРАТЬ
гр.Идентификатор,
гр.CAT_NAME,
Граф (стр.)
Из проекта Р
Левое соединение Категория c ВКЛ c.ID = p. CAT_ID
Группа по имени пользователя p.


Замечание: UNION действительно объединяет два запроса подряд, что, как я думаю, не является вашим запросом.

Elaine94

мне нужно выбрать 2 запроса за один раз, чтобы получить один результат. мне нужно отобразить общее количество имен каждой категории в таблице категорий, используя имя пользователя в таблице проектов. в таблице category столбец category name имеет 7 названий категорий,и каждое из названий категорий мне нужно подсчитать идентификатор проекта из таблицы project. таблица проектов и таблица категорий соединены.

CHill60

Если вы также предоставите некоторые примеры данных для таблицы проекта и некоторые ожидаемые результаты, то вам будет легче помочь

2 Ответов

Рейтинг:
2

Kornfeld Eliyahu Peter

Ваш второй выбор на самом деле не передает SQL - Столбец "p. cat_id" недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.

select p.cat_id, count(p.id) as count from asuwaris.project p

Так что исправь это...
Другими аспектами союза являются:
1. одинаковое количество колонок-ОК
2. те же типы данных - я не могу проверить это для вас...


Elaine94

p. cat_id-это идентификатор в таблице категорий, который означает внешний ключ. тип данных один и тот же.

Kornfeld Eliyahu Peter

Не вижу, насколько ваш комментарий релевантен...

Рейтинг:
14

CHill60

Вместо использования GROUP BY используйте оконные функции SQL. Например, перепишите свой запрос следующим образом.

SELECT DISTINCT c.id, c.cat_name, COUNT(p.id) OVER (PARTITION BY p.username, p.cat_id) as [count]
FROM category c
LEFT JOIN project p ON c.id = p.cat_id
where p.username = '013'
ORDER BY c.id;
Я использовал следующие примеры данных
create table category
(
	id int identity(1,1),
	cat_name nvarchar(125)
)
insert into category values
('New Project'),
('Uncategorized Project'),
('This year'),
('Next year'),
('Tender')

create table project
(
	id int identity(1,1),
	cat_id int,
	projectname nvarchar(125),
	username nvarchar(5)
)
insert into project values
(1,'Project1', '013'), (1,'Project2', '013'),
(3,'Project3', '013'), (3,'Project4', '013'),
(2,'Project5', '013'), (2,'Project6', '013'),
(1,'Project7', '013'), (1,'Project8', '013'),
(4,'Project9', '013'), (5,'Project10', '013'),
(6,'Project11', '013'), (7,'Project12', '013')
И я получил эти результаты
cat_id  Cat_name               Count
1	New Project	        4
2	Uncategorized Project	2
3	This year	        2
4	Next year	        1
5	Tender	                1


[EDIT-моя ошибка, я опубликовал решение MS-SQL вместо MySQL]
Чтобы преодолеть ошибку, которую вы получаете, просто включите имя категории В предложение GROUP BY:
SELECT c.id, c.cat_name, COUNT(p.id) as count
FROM category c
LEFT JOIN project p ON c.id = p.cat_id
where p.username = '013'
GROUP BY c.id, c.cat_name
ORDER BY c.id;
Результаты как указано выше

[Правка снова!]
К сожалению вы можете любой имейте только категории от 1 до 5, включенные для пользователя ' 013 ' (потому что для них есть записи в таблице проекта) или все категории от 1 до 9 включены (потому что запрос говорит включить те категории с количеством 0 в таблицу проекта).

Только с двумя таблицами нет никакого способа различить категории 6 и 7 с нулевым счетом, который вы делать хотите включить и категории 8 & 9, также с нулевым счетом, что вы не хочу включить.

Один из способов обойти это-иметь другую таблицу, которая назначает пользователя категории-как это
create table UserToCategory
(
	cat_id int,
	username nvarchar(5)
);
insert into UserToCategory (cat_id, username) values (1, '013');
insert into UserToCategory (cat_id, username) values (2, '013');
insert into UserToCategory (cat_id, username) values (3, '013');
insert into UserToCategory (cat_id, username) values (4, '013');
insert into UserToCategory (cat_id, username) values (5, '013');
insert into UserToCategory (cat_id, username) values (6, '013');
insert into UserToCategory (cat_id, username) values (7, '013');
Тогда этот запрос получит категории от 1 до 7 для пользователя 013:
SELECT c.id, c.cat_name, COUNT(p.id) as count
FROM UserToCategory cu 
LEFT JOIN category c ON c.id = cu.cat_id
LEFT JOIN project p on p.cat_id = c.id
where cu.username = '013'  
GROUP BY c.id, c.cat_name
ORDER BY c.id; 


Elaine94

я не могу запустить вашу команду sql в mysql workbench. получил ошибку, и ошибка говорит: "код ошибки: 1064. У вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MySQL для правильного синтаксиса для использования near '(PARTITION BY p. username, p.cat_id) as [count] FROM category c LEFT JOIN project' at line 1".

CHill60

Мои извинения - я опубликовал ответ MS SQL вместо MySQL. Попробую переписать.

Elaine94

все нормально. спасибо, что хочешь мне помочь. кстати, я обновил примерные данные и результат, который мне нужен. вы можете сослаться на это. извините, если вопрос не совсем ясен. я новичок в этом деле.

CHill60

У тебя все хорошо :-) Спасибо за обновление.
Я обновил свое решение, которое работает с MySQL 5.6, но я не получаю результатов, которые ожидал, когда менял данные, которые вы опубликовали, поэтому я все еще смотрю на него.

Elaine94

то же самое и со мной. спасибо за помощь. надеюсь, вы сможете мне помочь. :)

CHill60

Хорошо, запрос после [EDIT] в моем решении работает. Если вы также хотите включить нулевое количество для категорий, у которых нет проектов, вы должны обслуживать нулевое имя пользователя, например

SELECT c.id, c.cat_name, COUNT(p.id) as count
FROM category c
LEFT JOIN project p ON c.id = p.cat_id
where coalesce(p.username, '013') = '013'
GROUP BY c.id, c.cat_name
ORDER BY c.id;

Elaine94

это правда но ожидаемый результат я хочу быть таким:

идентификатор cat_name рассчитывать
1 Новый Проект 2
2 Некатегоризированный Проект 2
3 в этом году 2
4 в следующем году 2
5 тендер 1
6 ПО в 0
7 проиграл 0

команда mysql, которую вы мне даете, работает на моем mysql, но мне нужно отобразить ее так же, как и ожидаемый результат. мне нужно, чтобы отобразить имя категории 7 и команды MySQL показать все наименование категория. подсчет верен, но имя категории должно отображать только 7 имен категорий. прости, если я о многом тебя спрашиваю.

CHill60

Попробуйте выбрать DISTINCT.... и т. д. Извините-я полагаюсь на SQL Fiddle для тестирования, и он продолжает падать для меня

Elaine94

разве это так?

Выберите отчетливый гр.ИД, Си.cat_name, граф(стр. ИД) как посчитать
Из категории с
Слева присоединяйтесь к проекту p ON c.id = p. cat_id
где coalesce(p. username, '013') = '013'
Группа по c.id, c. cat_name
Заказ по c.идентификатор;

но когда я бегу, результат тот же.

CHill60

Теперь мне удалось запрыгнуть на настоящую машину :-) Теперь я вижу проблему более ясно. Я обновил свое решение (после "[EDIT again]") информацией, которая, как я надеюсь, поможет вам. Имейте в виду, что MySQL снова разбился на мне, так что в конце могут возникнуть незначительные проблемы с запросом.

Elaine94

я понял !!!!! большое спасибо за помощь. это много значит для меня. Большое спасибо.