[英]How to use 'IN' statement in mySQL cascaded SELECT statement?
我有两个表 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
我可以按如下方式阅读表 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”,或者将其保留为字符串并使用类似
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()
:
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 |
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.