GROUP BY和GROUP_CONCAT - 如何返回正确的值?

时间:2011-10-31 16:21:27

标签: mysql group-by group-concat

我有以下查询:

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

这是正确的,因为在session_id 169的expo_session_eval中有两条记录,但它的错误在于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

在session_id中制作扬声器列group_concat需要做什么?

编辑@NOAH

主表是expo_session_eval - 每条记录都存储了一个session_id。这些ID来自名为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个发言者是Steve Bullock,Sheila Bacon,会话169记录2个发言者是相同的,即使其他选定的值在两个会话169记录中都不相同。

(清楚如泥,对吗?)

2 个答案:

答案 0 :(得分:1)

您应按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

答案 1 :(得分:0)

这样的事情应该做你想做的事 -

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语句,只是为了创建一个串联的扬声器字符串,因此需要在子查询中完成。