如何在mySQL级联SELECT语句中使用'IN'语句?



我有两个表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

讨厌!:(

最新更新