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
Vous devez vous connecter pour publier un commentaire.
Au lieu d'utiliser
IN()
serait à l'aideFIND_IN_SET()
être une option trop?http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set
Voici un exemple complet basé sur l'exemple de problème dans la question, a confirmé, comme l'a démontré par le demandeur dans une précédente édition à la question:
Vous pouvez passer une chaîne de caractères sous forme de tableau, à l'aide d'une séparation, et exploser dans une fonction, qui fonctionne avec les résultats.
Pour un exemple trivial, si vous avez un tableau de chaîne comme ceci: "un|deux|arbre|quatre|cinq", et vous souhaitez savoir si des deux est dans le tableau, vous pouvez le faire de cette façon:
Je veux créer un ensemble de utile les fonctions de mysql pour fonctionner avec cette méthode. Toute personne intéressée veuillez me contacter.
Pour plus d'exemples, consultez http://blog.idealmind.com.br/mysql/how-to-use-string-as-array-in-mysql-and-work-with/