我有以下疑问:
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有两个speaker。
理想情况下,我希望我的结果如下:
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
我需要做什么才能使会话id内的演讲者列组一致?
为@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的表,其中包含名字和姓氏。
在expo_session_speaker中,给定会话id可以有多个记录-每个记录对应于一个会话和一个扬声器因此,要显示给定会话中的所有扬声器,您将得到多个记录。这就是group by/group concat的想法;我需要在该会话的所有记录中显示给定会话的所有发言者。因此,会话169记录1的发言者是Steve Bullock、Sheila Bacon,会话169记录2的发言者是相同的,即使两个会话169记录的其他选定值都不相同。
(像泥一样清澈,对吧?)
最佳答案
像这样的东西应该能满足你的要求-
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
实际上,您不想对整个结果集使用GROUPBY语句,只想创建一个连接的说话人字符串,因此需要在子查询中完成。
关于mysql - GROUP BY和GROUP_CONCAT-如何返回正确的值?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7956502/