Divida uma sequência MYSQL de GROUP_CONCAT em uma (matriz, como, expressão, lista) que IN () possa entender

Esta questão segue deOs resultados da junção MYSQL definem os resultados apagados durante IN () na cláusula where?

Então, versão curta da pergunta. Como você transforma a string retornada por GROUP_CONCAT em uma lista de expressões separadas por vírgulas que IN () tratará como uma lista de vários itens para repetir?

N.B. Os documentos do MySQL parecem se referir às "(vírgulas, separadas, listas)" usadas por IN () como 'listas de expressões' e, curiosamente, as páginas em IN () parecem ser mais ou menos as únicas páginas nos documentos do MySQL para sempre consulte listas de expressões. Portanto, não tenho certeza se as funções destinadas a criar matrizes ou tabelas temporárias seriam úteis aqui.

Versão longa baseada em exemplo da pergunta: De um banco de dados de 2 tabelas 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                  |
+----+------+----------------------+

Como posso transformar isso, que, uma vez que usa uma string, é tratado como equivalente lógico de (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)

... em algo em que o resultado GROUP_CONCAT é tratado como uma lista, de modo que, para Bob, seria 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)

... e para Jill, seria 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)

... para que o resultado geral seja uma cláusula de pesquisa exclusiva que exija todas as tags listadas que não usem HAVING COUNT (DISTINCT ...)?

(observação: essa lógica funciona sem o AND, aplicando-se ao primeiro caractere da sequência. por exemplo,

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)

questionAnswers(2)

yourAnswerToTheQuestion