我有两个表A和B。我需要使用GROUP_CONCT在一个组合语句中从它们中提取数据。目前,它并没有像我预期的那样工作。所以我把这个语句分成两个单独的简单语句来测试。
我就是这样做的。
Tabel A
FIELD1 FIELD
1 A
2 B
3 C
Table B
FIELD1 FIELD2
1 1,2
2 1
3 2,3
我可以阅读表格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
运算符来执行此操作,因为B.FIELD2
不是值列表(这是IN
所期望的(,而是字符串
您必须加入表格并使用FIND_IN_SET()
:
SELECT GROUP_CONCAT(A.FIELD2) FIELD2
FROM A INNER JOIN B
ON FIND_IN_SET(A.FIELD1, B.FIELD2)
WHERE B.FIELD1 = 3;
请参阅演示
结果:
| FIELD2 |
| ------ |
| B,C |
这有点难以解释。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"one_answers"3"两行,或者将其保留为字符串并像一样使用
SELECT GROUP_CONCAT(A.FIELD2)
FROM A
INNER JOIN B
ON CONCAT(',', B.FIELD2, ',') LIKE CONCAT('%,', A.FIELD1, ',%')
WHERE B.FIELD1=3
讨厌!:(