MySQL Подзапрос WHERE IN с несколькими столбцами - PullRequest
0 голосов
/ 18 июня 2020

Я создаю запрос / подзапрос SQL, который вернет список «учебных дней». Запрос, который я использую, похоже, не распознает значения из подзапроса, и я не могу понять, почему. Если я запускаю подзапрос, я получаю правильные значения. По какой-то причине, когда я пытаюсь запустить весь запрос и подзапрос вместе, он работает неправильно, и я получаю результаты только для 1-го значения в списке, разделенном запятыми. Если я выполню запрос ниже, я получу результаты только для 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 для этих трех значений, разделенных запятыми

Спасибо!

Ответы [ 2 ]

1 голос
/ 18 июня 2020

Вы можете JOIN classdays со своим подзапросом, но без CONCAT_WS, и использовать условие IN в предложении ON:

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)

Вам может понадобиться SELECT DISTINCT classdays.*, если подзапрос может возвращать более одного row, или если список c.cla_ID, c.next1, c.next2 может содержать дубликаты.

То, что 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
)

Обратите внимание, что вам не нужно JOIN для первых двух Детали UNION. И для последней части вы можете использовать INNER JOIN вместо LEFT JOIN.

0 голосов
/ 18 июня 2020

Вы не можете динамически создать список IN из строки.

Но вам также это не нужно, вы можете просто присоединить classdays.classday_classid к набору, возвращаемому подзапросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...