Разделить строку MYSQL из GROUP_CONCAT на (массив, например, выражение, список), который может понять IN ()

Этот вопрос следует из набора результатов объединения MYSQL, которые стерли результаты во время IN () в предложении where?

Итак, короткая версия вопрос. Как превратить строку, возвращаемую GROUP_CONCAT, в список выражений, разделенных запятыми, который IN () будет рассматривать как список из нескольких элементов, которые нужно перебрать?

NB. В документации MySQL, похоже, упоминаются «(запятые, разделенные, списки)», используемые IN () как «списки выражений», и, что интересно, страницы в IN () кажутся более или менее единственными страницами в документации MySQL, которые когда-либо ссылались на списки выражений. Поэтому я не уверен, будут ли здесь полезны функции, предназначенные для создания массивов или временных таблиц.


Длинная версия вопроса, основанная на примерах: Из БД с двумя таблицами, например:

SELECT id, name, GROUP_CONCAT(tag_id) FROM person INNER JOIN tag ON person.id = tag.person_id GROUP BY person.id;
+----+------+----------------------+
| id | name | GROUP_CONCAT(tag_id) |
+----+------+----------------------+
|  1 | Bob  | 1,2                  |
|  2 | Jill | 2,3                  |
+----+------+----------------------+

Как я могу это изменить, поскольку, поскольку он использует строку, обрабатывается как логический эквивалент (1 = X) AND (2 = X) ...

SELECT name, GROUP_CONCAT(tag.tag_id) FROM person LEFT JOIN tag ON person.id = tag.person_id 
GROUP BY person.id HAVING ( ( 1 IN (GROUP_CONCAT(tag.tag_id) ) ) AND ( 2 IN (GROUP_CONCAT(tag.tag_id) ) ) );
Empty set (0.01 sec)

... во что-то, где результат GROUP_CONCAT обрабатывается как список, так что для Боба он будет эквивалентен:

SELECT name, GROUP_CONCAT(tag.tag_id) FROM person INNER JOIN tag ON person.id = tag.person_id AND person.id = 1 
GROUP BY person.id HAVING ( ( 1 IN (1,2) ) AND ( 2 IN (1,2) ) );
+------+--------------------------+
| name | GROUP_CONCAT(tag.tag_id) |
+------+--------------------------+
| Bob  | 1,2                      |
+------+--------------------------+
1 row in set (0.00 sec)

... и для Джилл это будет эквивалентно :

SELECT name, GROUP_CONCAT(tag.tag_id) FROM person INNER JOIN tag ON person.id = tag.person_id AND person.id = 2 
GROUP BY person.id HAVING ( ( 1 IN (2,3) ) AND ( 2 IN (2,3) ) );
Empty set (0.00 sec)

... так что общим результатом будет предложение исключительного поиска, требующее всех перечисленных тегов, которые не используют HAVING COUNT (DISTINCT ...)?

(примечание: эта логика работает без AND, применяя к первый символ строки. например

SELECT name, GROUP_CONCAT(tag.tag_id) FROM person LEFT JOIN tag ON person.id = tag.person_id 
  GROUP BY person.id HAVING ( ( 2 IN (GROUP_CONCAT(tag.tag_id) ) ) );
+------+--------------------------+
| name | GROUP_CONCAT(tag.tag_id) |
+------+--------------------------+
| Jill | 2,3                      |
+------+--------------------------+
1 row in set (0.00 sec)

13
задан scottt 29 January 2019 в 12:22
поделиться