我在开发和生产服务器上运行相同的查询时遇到问题。我的应用程序存储 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/