Как объединить данные из нескольких таблиц с помощью SQL?

#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