Как использовать оператор IN в mySQL каскадном операторе SELECT? - PullRequest
0 голосов
/ 08 марта 2020

У меня есть две таблицы 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)

Любая помощь в исправлении утверждения?

Ответы [ 2 ]

2 голосов
/ 08 марта 2020

Вы можете сделать это с помощью оператора 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    |
2 голосов
/ 08 марта 2020

Это немного сложно объяснить. Оператор 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 в некоторых разделенных запятыми списках, которые вы найдете в строке таблицы

В нынешнем виде вам придется разделить '2,3' на две строки '2' и '3', или оставьте это как строку и используйте как

SELECT GROUP_CONCAT(A.FIELD2) 
FROM A
  INNER JOIN B 
  ON CONCAT(',', B.FIELD2, ',') LIKE CONCAT('%,', A.FIELD1, ',%')
WHERE B.FIELD1=3

Nasty! :)

...