Fractionner une chaîne MYSQL de GROUP_CONCAT en un tableau (like, like, expression, list) que IN () peut comprendre

Cette question est la suite de MYSQL joindre ensemble des résultats du essuyé des résultats au cours de la () dans la clause where?

Donc, la version courte de la question. Comment transformer la chaîne de caractères retournée par GROUP_CONCAT dans un séparées des virgules liste des expressions qui EN() permettra de traiter comme une liste de plusieurs éléments en boucle?

N. B. Le MySQL docs semblent renvoyer à l' "( virgule, séparées, des listes )" utilisé par () comme l '" expression de listes, et il est intéressant de noter les pages EN() semblent être plus ou moins les seules pages dans la MySQL docs de toujours se référer à l'expression des listes. Donc je ne sais pas si les fonctions destinées à la fabrication de tableaux ou de tables temporaires serait toute utilisation ici.


Exemple Long-version de la question: à Partir d'un 2-table DB comme ceci:

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

Comment puis-je faire cela, car il utilise une chaîne de caractères est considérée comme l'équivalent logique d' ( 1 = X ) ET ( 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)

...dans quelque chose où la GROUP_CONCAT résultat est traité comme une liste, de sorte que, pour Bob, il serait équivalent à:

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)

...et pour Jill, il serait équivalent à:

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)

...de sorte que le résultat global serait une exclusivité de recherche clause exigeant la liste de toutes les balises qui n'utilise pas AVOIR COUNT(DISTINCT ... ) ?

(remarque: Cette logique fonctionne sans le ET, en appliquant le premier caractère de la chaîne. par exemple,

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)

source d'informationauteur user568458 | 2011-01-10