2010-10-27 25 views
27

Ok, normalmente sé que haría algo como esto es que sabía los valores de la matriz:MySQL - ¿Cómo seleccionar las filas donde el valor está en la matriz?

SELECT * WHERE id IN (1,2,3) 

Pero ... No sé el valor de la matriz, sólo sé el valor que desea buscar en una matriz 'almacenada':

SELECT * WHERE 3 IN (ids) // Where ids is stored as 1,2,3 

Lo que no funciona. Hay otra manera de hacer esto?

+0

¿En qué lenguaje de programación está escribiendo la consulta? – VoteyDisciple

+0

es 'ids' a VARCHAR? –

+0

Estoy usando PHP y MySQL. – Tomas

Respuesta

48

uso del FIND_IN_SET function:

SELECT t.* 
    FROM YOUR_TABLE t 
WHERE FIND_IN_SET(3, t.ids) > 0 
+0

Usted señor, es una estrella. Busqué alto y bajo y sabía que tenía que estar allí. Mis instintos me dijeron que deberían haber usado CONTAINS para esto, pero qué sé yo. – Tomas

+3

@Tomas: Solo MySQL tiene esa función: cualquier otra base de datos, usted tendría que construir algo usted mismo. –

+0

No planeo cambiar ...pero definitivamente es bueno saberlo. – Tomas

15

En el momento de la consulta se pone a SQL que tiene que ya han ampliado la lista. La manera más fácil de hacer esto, si usted está utilizando identificaciones de algunos, la fuente de datos de confianza interna, donde se puede estar 100% seguro de que son números enteros (por ejemplo, si se ha seleccionado en su base de datos anterior) es la siguiente:

$sql = 'SELECT * WHERE id IN (' . implode(',', $ids) . ')'; 

Si los datos vienen del usuario, sin embargo, usted tendrá que asegurarse de que está recibiendo sólo valores enteros, tal vez lo más fácil de esta manera:

$sql = 'SELECT * WHERE id IN (' . implode(',', array_map('intval', $ids)) . ')'; 
+0

+1 para array_map ('intval', ...). También podría usar mysql_real_escape_string() en lugar de intval(), lo que dejaría la validación entera a MySQL, pero requeriría lógica adicional para citar los elementos de la matriz. –

+0

Gracias, pero como indiqué, conozco la identificación y no tuve que buscar filas basadas en un conjunto conocido. A la inversa, como se responde a continuación. – Tomas

+0

creo que el segundo ejemplo debería ser: $ sql = 'SELECT * WHERE id IN ('. Implode (',', array_map ('intval', $ ids)) '') '; –

4

Si se utiliza la función FIND_IN_SET:

FIND_IN_SET(a, columnname) produce todos los registros que tienen "a" en ellos, solo o con otros

Y

FIND_IN_SET(columnname, a) rendimientos sólo los registros que tienen "un" en ellas solo, NO los que tienen los demás

Así que si record1 es (a, b, c) y RECORD2 es (a)

FIND_IN_SET(columnname, a) sólo produce RECORD2 mientras que FIND_IN_SET(a, columnname) produce ambos registros.

3

Si el elemento de matriz no es entero se puede usar algo como a continuación:

$skus = array('LDRES10','LDRES12','LDRES11'); //sample data 

if(!empty($skus)){  
    $sql = "SELECT * FROM `products` WHERE `prodCode` IN ('" . implode("','", $skus) . "') "  
} 
+0

¿Es posible agregar el valor ** LIMIT ** de consulta con su desplazamiento? – Shiplu

Cuestiones relacionadas