mysql - INSTR() 和 GROUP_CONCAT() 在服务器之间返回不同的结果

标签 mysql sql group-concat

我在开发和生产服务器上运行相同的查询时遇到问题。我的应用程序存储 session 发言人和 session 。运行 MySQL 5.1 的开发服务器仅正确返回事件 session 的相关发言人,但运行 MySQL 5.0.9 的生产服务器返回多个不一定与该 session 关联的发言人。 (注意:此时我无法将生产服务器升级到 5.1。)

发言人表:

+------------+--------------+
| speaker_id |     name     |
+------------+--------------+
|        100 | John Doe     |
|        200 | Steve Rogers |
|        300 | Tony Stark   |
+------------+--------------+

session 表:

 +------------+------------------+
| session_id | session_speakers |
+------------+------------------+
|          1 | [100]            |
|          2 | [100,200]        |
|          3 | [300]            |
+------------+------------------+

SELECT 
s.session_id, 
GROUP_CONCAT(DISTINCT sp.name SEPARATOR ' & '), 
FROM 
sessions s
LEFT JOIN 
speakers sp ON INSTR(s.session_speakers, sp.speaker_id)
GROUP BY 
s.session_id

session_id = 1 的开发服务器结果

'John Doe'

session_id = 1 的典型生产服务器结果

'John Doe & Steve Rogers & &'

最佳答案

你应该标准化你的表格布局:

speakers
+------------+--------------+
| speaker_id |     name     |
+------------+--------------+
|        100 | John Doe     |
|        200 | Steve Rogers |
|        300 | Tony Stark   |
+------------+--------------+

sessions_to_speakers
 +------------+------------------+
| session_id | session_speakers |
+------------+------------------+
|          1 | 100            |
|          2 | 100            |
|          2 | 200            |
|          3 | 300            |
+------------+------------------+

sessions
+------------+--------------+
| session_id |     name     |
+------------+--------------+
|          1 | Session 1    |
|          2 | Session 2    |
|          3 | Session 3    |
+------------+--------------+

然后你可以使用一个简单的“加入”来获得所有的演讲者:

SELECT * FROM speakers INNER JOIN sessions_to_speakers ON 
sessions_to_speakers.session_speakers = speakers.speaker_id
WHERE sessions_to_speakers.session_id = 1;

建议: 修复您的列名称。如果它不是外键,请不要重复表名。即 speaker 表的 id 应称为 id(不是 speaker_id) .仅当从 session_to_speaker 表中引用时,它才应称为 speaker_id( session 和引用相同)

关于mysql - INSTR() 和 GROUP_CONCAT() 在服务器之间返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24003522/

相关文章:

php mysql IN 搜索行

c# - 如何从 GridView 中删除重复数据?

mysql - 如何按计数和类别获取数据

javascript - 将 javascript 对象保存为字符串

MySQL - 选择检索最后的日期时间

mysql - SQL - 慢速子查询

mysql WHERE IN 与日期时间不工作

mysql - 在包含唯一值的列上添加索引?

mysql - 按总列中的最低值排序,按年份,并在另一列上使用 GROUP BY

mysql多group_concat顺序保存