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

标签 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 有两位发言人。

理想情况下,我希望我的结果看起来像这样:

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/

相关文章:

mysql - 选择多个最大值

Mysql为每个组[用户]选择最近的2条记录

php - laravel 检索值与数据透视表匹配的所有用户

运行 mysql 查询的 Php 函数

PHP后端不断失败

php - 如何让 mysql Group_Concat 使用额外的 CONCAT 信息?

PHP MySQL GROUP_CONCAT 添加双引号

mysql - 代表特定日期字段的周报

sql-server - LINQ 中的分组/子查询到具有相关未分组列的实体

sql - 在子查询中分组?