2010-07-01 53 views
10

Lo siguiente funciona como se espera cuando hay un solo valor almacenado en una variable.valores múltiples en la variable mysql

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

Pero no funciona cuando hay múltiples valores almacenados en una variable.

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

¿Debo utilizar declaraciones preparadas para esto?

+0

SET: = " '20100630' , '20100701' "debe ser SET @a: =" 20100630, 20100701 ". Había agregado comillas para valores enteros, lo que provocó que no devolviera filas – Akash

Respuesta

3

No puede (hasta donde yo sepa) almacenar valores múltiples en una variable definida por el usuario de MySQL. Lo que han hecho es crear una cadena que contiene:

'20100630', '20100701' 

Eso es no dos valores diferentes, pero una sola cadena de valor, así como este es un único valor de cadena:

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

Es necesario utilizar dos variables independientes, o preparar una declaración, como esto:

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; 

Pero eso es un poco desordenado. ¿Por qué necesitas usar variables?

2

Algo como esto debería funcionar. ¿Está bien usar declaraciones preparadas para crear tablas temporales como esta?

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

Sé que esta es una publicación anterior pero funcionó perfectamente, especialmente cuando tiene múltiples valores. – sho

3

Usando GROUP_CONCAT y GROUP BY uno podría tirar de todos los valores (es decir, un ID) en una variable de este modo:

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

depende de la cantidad de valores. GROUP_CONCAT tiene una longitud máxima. – buggedcom

8

Hay una buena solución descrita aquí: https://stackoverflow.com/a/11957706/1523961

Así puede usar algo como esto:

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

Además, si eres selecto ting los identificadores para @a de otra tabla, se puede llegar a lo siguiente:

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; 

continuación

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

funciona bien para mí @ un

+0

No veo cómo puede funcionar esto. La primera consulta crea una cadena masiva que es la concatenación de 'field_table1' después de convertirla en una cadena. La segunda consulta verifica si 'field_table2' es igual a esa cadena masiva. – xhienne

Cuestiones relacionadas