2010-07-01 6 views
10

Ce qui suit fonctionne comme prévu lorsqu'une seule valeur est stockée dans une variable.plusieurs valeurs dans la variable mysql

SET @a := "20100630"; 
SELECT * FROM wordbase WHERE verified = @a; 

Mais cela ne fonctionne pas lorsque plusieurs valeurs sont stockées dans une variable.

SET @a := "'20100630', '20100701' "; 
SELECT * FROM wordbase WHERE verified in (@a); 

Dois-je utiliser des instructions préparées pour cela?

+0

SET @a: = « '20100630' , '20100701' "doit être SET @a: =" 20100630, 20100701 ". Vous avez ajouté des guillemets pour les valeurs entières, ce qui l'a obligé à ne renvoyer aucune ligne. – Akash

Répondre

3

Vous ne pouvez pas (autant que je sache) stocker plusieurs valeurs dans une variable définie par l'utilisateur MySQL. Ce que vous avez fait est de créer une chaîne qui contient:

'20100630', '20100701' 

qui ne sont pas deux valeurs distinctes, mais une seule valeur de chaîne, comme cela est une seule valeur de chaîne:

SET @a := "It's a single string, and that's the problem"; 

Vous devez utilisez deux variables distinctes, ou préparez une instruction, comme ceci:

SET @a := "20100630"; 
SET @b := "20100701"; 

SET @sql = CONCAT(
    'SELECT * FROM wordbase WHERE verified IN (', 
    @a, 
    ',', 
    @b, 
    ')' 
); 


SELECT @sql; 
+--------------------------------------------------------------+ 
| @sql               | 
+--------------------------------------------------------------+ 
| SELECT * FROM wordbase WHERE verified IN (20100630,20100701) | 
+--------------------------------------------------------------+ 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 

Mais c'est un peu compliqué. Pourquoi avez-vous besoin d'utiliser des variables?

2

Quelque chose comme ça devrait fonctionner. Est-il acceptable d'utiliser des instructions préparées pour créer des tables temporaires comme celle-ci?

SET @a := "'20100630', '20100701'"; 
SET @sql = CONCAT('create temporary table pn1 SELECT * FROM wordbase WHERE verified IN (', @a, ')'); 
PREPARE stmt FROM @sql; 
EXECUTE stmt; 

select * from pn1; 
+0

Je sais qu'il s'agit d'un ancien article, mais cela fonctionne parfaitement, surtout lorsque vous avez plusieurs valeurs. – sho

3

En utilisant GROUP_CONCAT et GROUP BY on pourrait tirer toutes les valeurs (par exemple un identifiant) dans une variable comme ceci:

SET @var := (SELECT GROUP_CONCAT(id) FROM `table` WHERE `verified` = @verified GROUP BY verified); 
+3

dépend de la quantité de valeurs. GROUP_CONCAT a une longueur maximale. – buggedcom

8

Il y a une bonne solution décrite ici: https://stackoverflow.com/a/11957706/1523961

Alors peut utiliser quelque chose comme cela:

SET @a := '20100630,20100701'; 
SELECT * FROM wordbase WHERE FIND_IN_SET(verified, @a); 

Aussi, si vous êtes selec ting les ids pour @a d'une autre table, vous pouvez venir avec ce qui suit:

SET @a := (SELECT GROUP_CONCAT(id) FROM someTable where yourBooleanExpressionHere); 
SELECT * FROM wordbase WHERE FIND_IN_SET(verified, @a); 
0
SELECT GROUP_CONCAT(field_table1 SEPARATOR ',') FROM table1 into @var; 

puis

SELECT * FROM table2 WHERE field_table2 in(@var); 

fonctionne bien pour moi

+0

Je ne vois pas comment cela peut fonctionner. La première requête crée une chaîne massive qui est la concaténation de 'field_table1' après la conversion en une chaîne. La deuxième requête vérifie si 'field_table2' est égal à cette chaîne massive. – xhienne

Questions connexes