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

标签 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

但是如果我使用我需要的这条语句,where 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

最佳答案

SQL 数据库不会“撕开”字段中的 csv 值。这三个片段将以相同的方式解析/执行:

... n.id IN (o.notes)
... n.id IN ('1,2')
... n.id = '1,2'

注意引号。 1,2 被视为一个整体字符串,而不是被逗号分开的两个单独的值。

如果你想使用这个糟糕的表设计(你真的应该规范化),那么使用 FIND_IN_SET()相反。

请注意,这会将您链接到 MySQL,并且您会失去可移植性。

关于MySQL: LEFT JOIN table ON table.id IN (),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32790490/

相关文章:

MySQL insert, update-heavy, 按索引排序

php - 使用 JSON/PHP 将 DATETIME 插入 mysql 数据库

php - 动态构建 <th >'s and <tr>' s

php - mysql中的日期格式,如何进行转换查询?

mysql - Php MySql 按距离和时间查询

mysql - 自连接 SQL 查询

mysql - 合并行并将它们的值放在 mysql 中的单独列中

mysql - mysql 中可用的任何部分外连接

mysql - 在mysql中用join替换子查询

sql - SQL联合/联接查询