我有两张桌子:
订单
+----+------+-------+
| id | name | notes |
+----+------+-------+
| 1 | Adam | 1,2 |
| 2 | Ema | 3 |
| 3 | Petr | 1,3 |
+----+------+-------+
备注
+----+---------------------+
| id | text |
+----+---------------------+
| 1 | This is first note |
| 2 | This is second note |
| 3 | And third note |
+----+---------------------+
我需要从Orders中选择行,并根据Orders.notes从第二个表中对concat Text进行分组。
如果我使用此声明
SELECT o.name, o.notes
,GROUP_CONCAT(DISTINCT n.text SEPARATOR ';') AS notes_text
FROM orders o
LEFT JOIN notes n ON n.id IN (1,2)
WHERE o.id = 1;
结果符合预期This is first note;This is second note
但如果我使用我需要的这个陈述,其中notes.id IN(orders.notes)
SELECT o.name, o.notes
,GROUP_CONCAT(DISTINCT n.text SEPARATOR ';') AS notes_text
FROM orders o
LEFT JOIN notes n ON n.id IN (o.notes)
WHERE o.id = 1
它只返回第一个文本This is first note
。为什么呢?
答案 0 :(得分:3)
SQL dbs将 NOT “撕开”字段中的csv值。这三个片段将以相同的方式解析/执行:
... n.id IN (o.notes)
... n.id IN ('1,2')
... n.id = '1,2'
注意引号。 1,2
被视为单个字符串,而不是逗号表示的两个单独值。
如果你想使用这种糟糕的表设计(你真的应该规范化),那么请改用FIND_IN_SET()。
请注意,这会将您链接到MySQL,并且您失去了可移植性。