GROUP_CONCAT не работает с IN () в MySQL - PullRequest
0 голосов
/ 05 февраля 2020

Мне нужно вернуть значения, используя оператор IN () на основе значений оператора GROUP_CONCAT () .

Этот запрос

SELECT GROUP_CONCAT(QUOTE(ID)) FROM primary_batch

по праву возвращает

'4','2','6','3','5','1'

Однако этот запрос

SELECT * FROM secondary_batch WHERE id IN (SELECT GROUP_CONCAT(QUOTE(ID)) FROM primary_batch)

не возвращает никакого вывода

Однако, если я размещу фактические значения

SELECT * FROM secondary_batch WHERE id IN ('4','2','6','3','5','1')

Я получаю ожидаемый результат.

Я не могу понять, почему это происходит. Я использую MySQL v5.7.

Я открыт для использования других решений, основанных на хранимых процедурах, для достижения этого результата, если действительно существует ограничение на использование операторов GROUP_CONCAT / IN таким образом.

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Однако, если я помещу фактические значения

SELECT * FROM secondary_batch WHERE id IN ('4','2','6','3','5','1')

Я получу ожидаемый результат.

Это не правильно. На самом деле ваш запрос выглядит как

SELECT * FROM secondary_batch WHERE id IN ('\'4\',\'2\',\'6\',\'3\',\'5\',\'1\'')

, то есть это не список, это значение одного строкового литерала.

Если вы хотите использовать GROUP_CONCAT () в подзапросе, конечно, тогда вы должны использовать

SELECT * 
FROM secondary_batch 
WHERE FIND_IN_SET(id, (SELECT GROUP_CONCAT(QUOTE(ID)) FROM primary_batch))

Но это излишне, нелогично и не имеет смысла.

1 голос
/ 05 февраля 2020

Нельзя использовать GROUP_CONCAT в подзапросе, так как вы хотите возвращать отдельные ID значения, а не строку, разделенную запятыми (см. Руководство для обсуждения того, как использовать IN с подзапросами). Это должно работать:

SELECT * 
FROM secondary_batch
WHERE id IN (SELECT ID FROM primary_batch)
...