2010-09-16 4 views
4

je stocke une liste difficile devariables MySQL, GROUP_CONCAT, et l'utiliser plus tard

SELECT @items := GROUP_CONCAT(ID) FROM table_1 ... etc 

@items est maintenant une chaîne de nombres: 55,77,99,2038,2844, etc

Plus tard, j'essaie de l'utiliser dans une clause where en tant que telle:

SELECT * FROM table_2 WHERE table_1.ID IN (@items) 

Cela ne fonctionne pas. Il semble que ça devrait. Je sais que quand je tire manuellement les données, le mettre dans une variable, sortie il cela fonctionne:

list($x) = SELECT @items := GROUP_CONCAT(ID) FROM table_1 ... etc 
$goodResults = SELECT * FROM table_2 WHERE table_1.ID IN ($x) 

Toutes les idées? Merci.

Répondre

10

Vous pouvez utiliser la fonction FIND_IN_SET():

SELECT * FROM table_1 WHERE FIND_IN_SET(id, @items) > 0; 

Cas de test:

CREATE TABLE table_1 (id int, group_id int); 
INSERT INTO table_1 VALUES (1, 1); 
INSERT INTO table_1 VALUES (2, 1); 
INSERT INTO table_1 VALUES (3, 1); 
INSERT INTO table_1 VALUES (4, 1); 
INSERT INTO table_1 VALUES (5, 1); 

SELECT @items := GROUP_CONCAT(id) FROM table_1 GROUP BY group_id; 

SELECT * FROM table_1 WHERE FIND_IN_SET(id, @items) > 0; 
+------+----------+ 
| id | group_id | 
+------+----------+ 
| 1 |  1 | 
| 2 |  1 | 
| 3 |  1 | 
| 4 |  1 | 
| 5 |  1 | 
+------+----------+ 
5 rows in set (0.02 sec) 

SQL FIDDLE

+0

Cela a fonctionné Merci beaucoup: D – Tickthokk

+0

Chose PARFAITE! (: – LLPrudente

0

Depuis MySQL manual:

« variables définies par l'utilisateur sont spécifique à la connexion, c'est-à-dire un utilisateur var iable défini par un client ne peut pas être vu ou utilisé par d'autres clients. Toutes les variables pour une connexion client donné sont libérés automatiquement lorsque que les sorties du client. »

Parce que vous avez noté « plus tard » il est possible que la connexion créant la variable a été détruite et la variable est perdue.

Pouvez-vous ?..! maintenir temporairement la valeur de la variable dans une table

+1

Oui, c'est la même connexion.Bonne pensée cependant, je serai plus précis la prochaine fois :) – Tickthokk

Questions connexes