MySQL:LEFT JOIN表ON table.id IN()

时间:2015-09-25 20:52:25

标签: mysql join

我有两张桌子:

订单

+----+------+-------+
| 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。为什么呢?

SQLFiddle

1 个答案:

答案 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,并且您失去了可移植性。