【问题标题】:How to use 'IN' statement in mySQL cascaded SELECT statement?如何在 mySQL 级联 SELECT 语句中使用“IN”语句?
【发布时间】:2020-06-20 19:47:45
【问题描述】:

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

对修改语句有帮助吗?

【问题讨论】:

标签: mysql sql csv group-concat


【解决方案1】:

这有点难以解释。 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

就目前而言,您必须 split the '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

恶心! :)

【讨论】:

  • 非常感谢您的详细解释。这真的很有帮助。我认为最好的办法是重新设计表结构。
【解决方案2】:

您可以使用 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;

请参阅demo
结果:

| FIELD2 |
| ------ |
| B,C    |

【讨论】:

  • 非常感谢。我想我需要重新设计表格,因为这必须在搜索中。这行得通,但不太可能有效。
猜你喜欢
  • 2010-12-07
  • 2011-01-12
  • 2016-12-29
  • 1970-01-01
  • 2015-09-17
  • 2012-06-15
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
相关资源
最近更新 更多