【发布时间】:2020-06-20 00:54:02
【问题描述】:
我正在创建一个 SQL 查询/子查询,它将返回“上课日”列表。我正在使用的查询似乎无法识别子查询中的值,我不知道为什么。如果我运行子查询,我会得到正确的值。出于某种原因,当我尝试一起运行整个查询和子查询时,它无法正常工作,并且我只能得到逗号分隔列表中第一个值的结果。如果我运行下面的查询,我只会得到 tblclasses.cla_ID = 1234 的结果:
SELECT
*
FROM
classdays
WHERE
classdays.classday_classid IN (SELECT
CONCAT_WS(', ',
tclasses.cla_ID,
tclasses.cla_nextclass,
tclasses_1.cla_nextclass) AS nextclasses
FROM
tclasses
LEFT JOIN
tclasses AS tclasses_1 ON tclasses.cla_nextclass = tclasses_1.cla_ID
WHERE
tclasses.cla_ID = 1234)
但是,如果我只运行子查询,它可以工作并且我得到值列表:1234、5678、9012
(SELECT CONCAT_WS(', ',tclasses.cla_ID,tclasses.cla_nextclass,tclasses_1.cla_nextclass) AS nextclasses
FROM
tclasses
LEFT JOIN
tclasses AS tclasses_1 ON tclasses.cla_nextclass = tclasses_1.cla_ID
WHERE
tclasses.cla_ID = 1234)
如果我像这样简单地使用 IN 语句中的值运行查询,它也可以工作:
SELECT
*
FROM
classdays
WHERE
classdays.classday_classid IN (1234, 5678, 9012)
任何帮助将不胜感激,因为由于某种原因,我无法让 IN 语句在这 3 个逗号分隔值上运行
谢谢!
【问题讨论】:
-
IN不适用于逗号分隔的字符串。当您使用x IN (subquery)时,它会与子查询结果的每一行进行精确比较。 -
不要将列与
CONCAT_WS合并,而是使用UNION将它们放在单独的行中。 -
3 个逗号分隔的值被视为文字字符串
'value1, value2, value3'。 -
@Barmar - 我以前从未真正使用过 UNION 查询。我了解它的基础知识,但是由于我本质上是在自身上加入同一个表
LEFT JOIN tclasses AS tclasses_1 ON tclasses.cla_nextclass = tclasses_1.cla_ID该 UNION 查询看起来如何?