Dividir una cadena MYSQL de GROUP_CONCAT en una (matriz, como, expresión, lista) que IN () puede entender

Esta pregunta sigue de¿Los resultados de la unión MYSQL establecen resultados borrados durante IN () en la cláusula where?

Entonces, versión corta de la pregunta. ¿Cómo convierte la cadena devuelta por GROUP_CONCAT en una lista de expresiones separadas por comas que IN () tratará como una lista de múltiples elementos para recorrer?

nótese bien Los documentos de MySQL parecen referirse a los "(comas, separados, listas)" utilizados por IN () como 'listas de expresiones', y curiosamente las páginas en IN () parecen ser más o menos las únicas páginas en los documentos de MySQL para alguna vez consulte las listas de expresiones. Entonces, no estoy seguro de si las funciones destinadas a hacer matrices o tablas temporales serían de alguna utilidad aquí.

Versión larga de la pregunta basada en ejemplos: de un DB de 2 tablas como este:

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                  |
+----+------+----------------------+

¿Cómo puedo convertir esto, que ya que usa una cadena se trata como un equivalente lógico de (1 = X) Y (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)

... en algo donde el resultado GROUP_CONCAT se trata como una lista, de modo que para Bob, sería equivalente a:

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)

... y para Jill, sería equivalente a:

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)

... entonces, ¿el resultado general sería una cláusula de búsqueda exclusiva que requiera todas las etiquetas enumeradas que no utilicen HAVING COUNT (DISTINCT ...)?

(nota: esta lógica funciona sin el AND, aplicando al primer carácter de la cadena.

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)

Respuestas a la pregunta(2)

Su respuesta a la pregunta