Получение данных из нескольких таблиц в одну строку при объединении некоторых значений - PullRequest
0 голосов
/ 30 марта 2012

Я пытаюсь извлечь данные из таблиц и объединить несколько строк в один столбец, не повторяя никакой информации.

У меня есть следующие таблицы: профиль, квалификация, проекты.

Profile

pro_id  surname       firstname   
------  -------       ----------
   1    John          James           
   2    King          Fred        
   3    Luxury-Yachts Raymond

Qualification

pro_id  Degree   School               Year
------  ------   ------               -----
   1    MBA      Wharton university   2002        
   1    LLB      Yale University      2001    
   2    BSc      Covington University 1998
   2    BEd      Kellog University    1995

Projects

pro_id  Title                         Year
------  ------                        ------   
   1    Social Networking             2003        
   1    Excavation of aquatic debris  2007    
   2    Design of solar radios        1992
   2    Development of expert systems 2011

Я хочу получить всю информацию для каждого человека, причем каждый человек появляется только один раз в результате.Информация о квалификациях и проектах должна быть в отдельной колонке (одна колонка для квалификаций, другая для проектов), разделенных запятыми.Например, результаты для приведенных выше примеров данных должны быть:

1  John James             MBA Wharton university 2002, LLB Yale University 2001                     Social Networking 2003, Excavation of aquatic debris 2007, Design of Solar panels 2008
2  King Fred              BSc Covington University 1998, BEd Kellog University 1995, Msc MIT 2011   Design of solar radios 1992, Development of expert systems 2011
3  Raymond Luxury-Yachts

В настоящее время у меня есть запрос:

SELECT pro_id,
       surname,
       firstname,
       group_concat(degree,school,year) AS qual,
       concat(Title,year) AS work
FROM profile,
       LEFT JOIN qualification
           ON qualification.pro_id = profile.pro_id 
       JOIN projects
           ON projects.pro_id = profile.pro_id 
GROUP BY pro_id

Для примеров данных этот запрос приводит к:

1  John James MBA  Wharton university 2002,  Social Networking 2003 
1  John James LLB  Yale University 2001, Excavation of aquatic debris 2007
1  John James MBA  Wharton university 2002,  Social Networking 2003, Excavation of aquatic debris 2007
etc

Примечание: Raymond Luxury-Yachts отсутствует в текущем результате.

Я не хочу дублировать записи результатов.Также, если у фамилии нет записи в таблице квалификаций и проектов, я хочу, чтобы запрос возвращал имя и отображал пустое поле в таблице квалификаций и проектов, а не пропускал их вообще.

Ответы [ 3 ]

0 голосов
/ 30 марта 2012

Использование Join решит проблему с отображением значений, даже если в таблице проектов нет записей. По первому вопросу вы можете попробовать создать хранимую функцию и вызвать ее из оператора select. Эта функция примет pro_id в качестве параметра, создаст объединенную строку и вернет ее. Это единственное решение для MySQL, о котором я могу думать на данный момент.

0 голосов
/ 31 марта 2012

Я думаю, что вы близки к своим мыслям о group_concat. Однако, с возможными значениями No (таким образом, оставляя нулевые значения), могут возникнуть проблемы. Я хотел бы, чтобы каждая вторичная таблица была предварительно конкатенацирована по идентификатору человека и присоединялась к ЭТОМУ результату. Устраняет проблему нулей

SELECT
      p.pro_id,
      p.surname,
      p.firstname,
      PreQConcat.UserQual,
      PrePJConcat.UserWork
   FROM 
      profile p
         LEFT JOIN 
            ( select q.pro_id,
                     group_concat( q.degree, q.school, q.year) AS UserQual
                 from
                     qualification q
                 group by
                     q.pro_id ) PreQConcat
            ON p.Pro_ID = PreQConcat.pro_id

         LEFT JOIN 
            ( select pj.pro_id,
                     concat(pj.Title, pj.year) AS UserWork
                 from
                     projects pj
                 group by
                     pj.pro_id ) PrePJConcat
            ON p.Pro_ID = PrePJConcat.pro_id

В любом случае, вы проходите через всех людей и хотите, чтобы все их соответствующие элементы (если они существуют) были сгруппированы, так почему группируйте, если существует вероятность, что этого не существует. Пусть запросы JOINED выполняются по одному разу, завершаются одним результатом, сгруппированным только по тем людям, для которых у него были данные, а затем присоединяются к исходному профилю.

0 голосов
/ 30 марта 2012

Заменить левое соединение с JOIN

Select pro_id, surname, firstname, group_concat(degree,school,year) as qual,concat(Title,year) as work 
from profile
join qualification on qualification.pro_id = profile.pro_id 
join projects on projects.pro_id = profile.pro_id group by pro_id

В чем разница между "INNER JOIN" и "OUTER JOIN"?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...