我有以下查询:
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 有两位发言人。
理想情况下,我希望我的结果看起来像这样:
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 可以有多个记录 - 每个记录对应一个 session 和一个演讲者。因此,要显示给定 session 的所有发言人,您最终会得到多个记录。这就是 group by/group_concat 想法的来源;我需要在该 session 的所有记录中显示给定 session 的所有发言人。因此, session 169 记录 1 的发言人是 Steve Bullock、Sheila Bacon,而 session 169 记录 2 的发言人是相同的,即使两个 session 169 记录的其他选定值都不相同。
(一清二楚,对吧?)
最佳答案
您应该按 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
关于mysql - GROUP BY 和 GROUP_CONCAT - 如何返回正确的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7956502/