我有两个表A和B。我需要使用GROUP_CONCAT在组合语句中从它们中提取数据。目前,它无法正常运行。因此,我将该语句分为两个单独的简单语句进行测试。
这就是我的做法。
Tabel A
FIELD1 FIELD
1 A
2 B
3 C
Table B
FIELD1 FIELD2
1 1,2
2 1
3 2,3
我可以按如下方式阅读Tabel B
SELECT B.FIELD2 FROM B WHERE FIELD1=3
输出是
FIELD2
2,3
现在,如果我按如下方式阅读表A,
SELECT GROUP_CONCAT(A.FIELD2) FROM A WHERE FIELD1 IN (2,3)
我知道
FIELD2
B,C
现在,我想通过以下语句获得相同的输出,但失败。
SELECT GROUP_CONCAT(A.FIELD2) FROM A WHERE FIELD1 IN (SELECT B.FIELD2 FROM B WHERE FIELD1=3)
是否有帮助修改该语句?
这有点难以解释。 IN运算符不会查看列中的CSV字符串,而是将其视为逗号分隔的要查看的值列表。如果列值是一些CSV数据,则in运算符将在其他值列表中查找该确切的字符串,逗号和所有内容。
2 IN (1,2) --true '2' IN ('1','2') --true '2' IN ('1,2') --false '1,2' IN ('1,2') --true
始终记住,您的SQL就像其他程序一样被编译。您写入语句的数据将成为程序的一部分。表中的数据不成为程序的一部分。这就是为什么您不能在表格行中用逗号分隔的某些东西上使用IN的原因
按现状,您必须将'2,3'分为两行'2'和'3',或将其保留为字符串并使用like
SELECT GROUP_CONCAT(A.FIELD2) FROM A INNER JOIN B ON CONCAT(',', B.FIELD2, ',') LIKE CONCAT('%,'A, .FIELD1, ',%') WHERE B.FIELD1=3
讨厌! :)
您可以使用IN
运算符来执行此操作,因为B.FIELD2
不是值列表(这是IN
期望的值),而是一个字符串。您必须加入表并使用FIND_IN_SET()
: