GROUP BY и GROUP_CONCAT - как вернуть правильные значения? - PullRequest
1 голос
/ 31 октября 2011

У меня есть следующий запрос:

SELECT ev.q1, ev.comments, es.session_number, es.title, CONCAT( np.first_name,  ' ', np.last_name ) AS speaker
FROM  `expo_session_eval` ev
LEFT JOIN expo_session es ON es.session_id = ev.session_id
LEFT JOIN expo_session_speaker ess ON ess.session_id = ev.session_id
LEFT JOIN expo_speaker sp ON sp.speaker_id = ess.speaker_id
LEFT JOIN new_people np ON np.id = sp.people_id
GROUP BY CONCAT( np.first_name,  ' ', np.last_name ) 
ORDER BY es.session_number

Это возвращает данные, которые выглядят так:

session_id  q1  comments    session_number  title               speaker
===================================================================================
169         3   Good!       103            Digital Practices      Steve Bullock
169         3   Good!       103            Digital Practices      Sheila Bacon
170         1               104            LBS = Location Based   Patrick Moorhead

Это правильно, потому что в expo_session_eval есть две записи для session_id 169,но это неверно в том, что значения q1 и comments не идентичны.В expo_session_speaker есть две записи, которые соответствуют session_id 169 - то есть есть две колонки для этой одной сессии.

В идеале я хотел бы, чтобы мои результаты выглядели так:

session_id  q1  comments    session_number  title                  speaker
===============================================================================================
169         3   Good!       103            Digital Practices        Steve Bullock, Sheila Bacon
169         5   Great!      103            Digital Practices        Steve Bullock, Sheila Bacon
170         1               104            LBS = Location Based     Patrick Moorhead

Я пытался использовать GROUP_CONCAT, но, видимо, я не использую его правильно, потому что, когда я использую этот запрос:

SELECT ev.session_id, ev.q1, ev.comments, es.session_number, es.title, GROUP_CONCAT( CONCAT( np.first_name,  ' ', np.last_name ) ) AS speaker
FROM  `expo_session_eval` ev
LEFT JOIN expo_session es ON es.session_id = ev.session_id
LEFT JOIN expo_session_speaker ess ON ess.session_id = ev.session_id
LEFT JOIN expo_speaker sp ON sp.speaker_id = ess.speaker_id
LEFT JOIN new_people np ON np.id = sp.people_id
ORDER BY es.session_number

я получаю это:

session_id  q1  comments    session_number  title                  speaker
===============================================================================================
169         3   Good!       103         Digital Practices   Steve Bullock,Sheila Bacon,Patrick Moorhead

Что мне нужносделать, чтобы сделать колонку динамика group_concat в пределах session_id?

РЕДАКТИРОВАТЬ ДЛЯ @ NOAH

Основная таблица - expo_session_eval - в каждой записи хранится идентификатор сеансаЭти идентификаторы взяты из таблицы expo_session.Существует таблица перекрестных ссылок с именем expo_session_speaker, которая содержит только два столбца - session_id и speaker_id.Есть еще одна таблица speaker_id, которая содержит speaker_id и people_id.people_id связывает таблицу с таблицей с именем new_people, которая содержит first_name и last_name.

В expo_session_speaker может быть несколько записей для данного session_id - каждая запись соответствует одному сеансу и одному оратору.Таким образом, чтобы отобразить ВСЕ говорящие для данного сеанса, вы получите несколько записей.Вот тут и пришла идея группы по / group_concat;Мне нужно отобразить ВСЕ динамики для данного сеанса во ВСЕХ записях для этого сеанса.Следовательно, в сеансе 169 записи 1 выступают Стив Баллок, Шейла Бэкон, а в сеансе 169 запись 2 выступают одинаково, хотя ни одно из других выбранных значений не будет одинаковым для двух сеансов 169 записей.

(Ясно, как грязь, верно?)

Ответы [ 2 ]

1 голос
/ 31 октября 2011

Вы должны сгруппировать по session_id (вместо заказа)

SELECT ev.session_id, ev.q1, ev.comments, es.session_number, es.title, GROUP_CONCAT(  CONCAT( np.first_name,  ' ', np.last_name ) ) AS speaker
FROM  `expo_session_eval` ev
LEFT JOIN expo_session es ON es.session_id = ev.session_id
LEFT JOIN expo_session_speaker ess ON ess.session_id = ev.session_id
LEFT JOIN expo_speaker sp ON sp.speaker_id = ess.speaker_id
LEFT JOIN new_people np ON np.id = sp.people_id
GROUP BY ev.session_id
0 голосов
/ 31 октября 2011

Что-то вроде этого должно делать то, что вы хотите -

SELECT ev.session_id, ev.q1, ev.comments, es.session_number, es.title, speaker
FROM  `expo_session_eval` ev
LEFT JOIN expo_session es ON es.session_id = ev.session_id
LEFT JOIN (
    SELECT ess.session_id, GROUP_CONCAT( CONCAT( np.first_name,  ' ', np.last_name ) ) AS speaker
    FROM new_people np
    LEFT JOIN expo_speaker sp ON  np.id = sp.people_id
    LEFT JOIN expo_session_speaker ess ON sp.speaker_id = ess.speaker_id
    GROUP BY ess.session_id
) np ON np.session_id = es.session_id   
ORDER BY es.session_number

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

...