繁体   English   中英

MySQL WHERE IN 具有多列的子查询

[英]MySQL WHERE IN subquery with multiple columns

我正在创建一个 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 个逗号分隔值上运行

谢谢!

您可以使用子查询但不使用classdays加入上课日,并在 ON 子句中使用 IN 条件:

SELECT classdays.*
FROM classdays
JOIN (
  SELECT 
    tclasses.cla_ID,
    tclasses.cla_nextclass as next1,
    tclasses_1.cla_nextclass as next2
  FROM tclasses
  LEFT JOIN tclasses AS tclasses_1
    ON tclasses.cla_nextclass = tclasses_1.cla_ID
  WHERE tclasses.cla_ID = 1234
) c ON classdays.classday_classid IN (c.cla_ID, c.next1, c.next2)

You might need SELECT DISTINCT classdays.* , if the subquery can return more than one row, or wehen the list c.cla_ID, c.next1, c.next2 can contain duplicates.

Barmar 提到的UNION将是

SELECT classdays.*
FROM classdays
WHERE classdays.classday_classid IN (
  SELECT tclasses.cla_ID
  FROM tclasses 
  WHERE tclasses.cla_ID = 1234

  UNION

  SELECT tclasses.cla_nextclass
  FROM tclasses
  WHERE tclasses.cla_ID = 1234

  UNION 

  SELECT tclasses_1.cla_nextclass
  FROM tclasses
  JOIN tclasses AS tclasses_1 ON tclasses.cla_nextclass = tclasses_1.cla_ID
  WHERE tclasses.cla_ID = 1234
)

请注意,前两个 UNION 部分不需要 JOIN。 对于最后一部分,您可以使用 INNER JOIN 而不是 LEFT JOIN。

您不能从字符串动态创建 IN 列表。

但是你也不需要,你可以将 classdays.classday_classid 加入到子查询返回的集合中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM