#mysql #sql #join
#mysql #sql #Присоединиться
Вопрос:
В моей базе данных MySQL есть следующие таблицы :
----------------------------------------------
PROJECT
----------------------------------------------|
----------------------------------------------|
project_id | team_size | from_date
----------------------------------------------|
1 | 34 | 1 Dec 2010
----------------------------------------------|
2 | 2 | 2 Jan 1902
----------------------------------------------|
3 | 99 | 15 Aug 1947
----------------------------------------------
----------------------------------------------
Technologies
----------------------------------------------
----------------------------------------------
technology_id | technology_name
----------------------------------------------
1 | Java
----------------------------------------------
2 | CPP
----------------------------------------------
3 | Hibernate
----------------------------------------------
4 | EJB
----------------------------------------------
5 | Python
----------------------------------------------
6 | Hadoop
----------------------------------------------
7424 | Perl
----------------------------------------------
Для связывания Project
и Technologies
таблиц у меня есть следующая таблица :
----------------------------------------------
Project_Technologies
----------------------------------------------
----------------------------------------------
Project_ID | Technology_ID
----------------------------------------------
1 | 2
----------------------------------------------
1 | 7424
----------------------------------------------
2 | 1
----------------------------------------------
2 | 3
----------------------------------------------
2 | 4
----------------------------------------------
2 | 5
----------------------------------------------
Я хочу отобразить данные в одной таблице в виде строк и столбцов в пользовательском интерфейсе.
Например :
---------------------------------------------------
project_id | team_size | from_date | technologies
|---------------------------------------------------|
| 1 | 34 | 1 Dec 2010| CPP, Perl |
|---------------------------------------------------|
| 2 | 2 | 2 Jan 1902| Java, Hibernate, EJB, Python |
|---------------------------------------------------|
| 3 | 99 |15 Aug 1947| |
---------------------------------------------------
Я не могу сформировать sql-запрос, чтобы получить что-то вроде этого. Я попробовал следующий запрос, который выдает мне повторяющиеся строки.
select pr.project_id,pr.team_size,pr.from_date,tech.technology_name
from project pr, project_technologies ptech, technologies tl
where pr.project_id=ptech.project_id and ptech.technology_id=tl.technology_id
Я хотел бы знать, как избежать дублирования строк? В настоящее время этот запрос выдает мне 2 строки при project_id = 1 и 4 строки при project_id = 2
Комментарии:
1. @CodeBuzz, я только сейчас попробовал distinct, но получаю тот же результат. Я добавлю вывод текущего запроса, о котором идет речь.
Ответ №1:
Это должно сработать … group by и group_concat
select
pr.project_id,
pr.team_size,
pr.from_date,
GROUP_CONCAT(tech.technology_name separator ', ') as technologies
from
project pr
JOIN project_technologies ptech ON pr.project_id=ptech.project_id
JOIN technologies tl ON ptech.technology_id=tl.technology_id
GROUP BY
pr.project_id,
pr.team_size,
pr.from_date
Исправлено ИЗМЕНЕНИЕ, включающее предложение JOIN
Комментарии:
1. Я думаю, вам следует использовать операцию inner join в mysql для объединения двух таблиц по общим атрибутам, которая также позволяет избежать дублирования.
2. Я добавил причины объединения, изначально я только что представил исправление, необходимое для работы, но я вижу разумность в том, чтобы исправить и это. Спасибо!
3. Если вы сделаете это внешним соединением, вы получите 3-ю строку с нулевым столбцом из group_concat. Соединение MySQL по умолчанию является внутренним.
4. Это хороший момент, чтобы быть ближе к выводам пользовательского интерфейса, которые показала операция, они ДОЛЖНЫ быть оставлены внешними соединениями.
5. Привет, Стефан, твой измененный ответ, который включает предложение JOIN, не работает. Я получаю следующую ошибку: «У вас ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с «ОБЪЕДИНИТЬ технологии tl В ptech.technologies id=tl.technologiesy_id» ГРУППА ПО
Ответ №2:
Попробуйте это —
SELECT p.*, GROUP_CONCAT(t.technology_name) technologies FROM project p
JOIN project_technologies pt
ON pt.project_id = p.project_id
JOIN technologies t
ON t.technology_id = pt.technology_id
GROUP BY p.project_id;
Комментарии:
1. вы не сможете выбирать элементы, не включенные в group by, если они не являются агрегатными функциями…
2. Извините, я должен был скорее сказать, что вы не должны. Насколько мне известно, это противоречит стандарту ANSI sql, и в некоторых режимах mysql вы фактически не можете возвращать неагрегированные столбцы, которые не указаны в group by.
3. @Stefan H Вы правы. … и я надеюсь, что project.project_id уникален;-)
Ответ №3:
ИСПОЛЬЗУЙТЕ ЭТО:
ВЫБЕРИТЕ ПРОЕКТ.*, Технологии.* ОТ Project_Technologies ПРОЕКТ ВНУТРЕННЕГО ОБЪЕДИНЕНИЯ В Project_Technologies.Project_ID = PROJECT.project_id Технологии ВНУТРЕННЕГО СОЕДИНЕНИЯ В Project_Technologies.Технология_ID = Technologies.технология_id