2009-04-27 12 views
10

Tengo problemas para encontrar una forma mejor de buscar en MySQL un par de valores en una tabla. Tengo los pares de valores en una matriz y me gustaría duplicar la función IN(), pero para más de 1 valor.MySQL IN() para dos valores/matriz?

Por ejemplo; Tengo las siguientes 3 pares:

foo,1 
boo,2 
goo,3 

La solución actual me ponga en:

SELECT * FROM [table] WHERE 
(column1 = 'foo' AND column2 = 1) OR 
(column1 = 'boo' AND column2 = 2) OR 
(column1 = 'goo' AND column2 = 3); 

Me gustaría pensar que hay una solución más "atractiva" ver que podía tener tantos como una Cien pares y tener eso puede hacer que las RAS me hagan sentir náuseas. ¡¡¡Gracias!!!

Respuesta

30
SELECT * 
FROM foo 
WHERE (column1, column2) IN (('foo', 1), ('bar', 2)) 

Esta sintaxis puede ser confuso, y puede ser más legible para sustituirla por:

SELECT * 
FROM foo 
WHERE ROW(column1, column2) IN (ROW('foo', 1), ROW('bar', 2)) 

Estoy acostumbrado a la anterior, aunque :)

+0

que funciona muy bien! Parece tan obvio ahora que lo he visto. – Typhon

+0

¡Esto es exactamente lo que estaba buscando! No lo sabía ... ¡Gracias amigo! – Tenaciousd93

2

Si es posible Obtenga sus valores en una tabla temporal (solo necesita las dos columnas) de manera fácil y rápida, solo puede UNIRSE INMEDIATAMENTE a su camino hacia allí. Si no, tendrás que usar la versión de @Quassnoi.

0

¡¡Grandes respuestas de @Quassnoi y @KM !!!

Además, se puede obtener pares duplicados y seleccionarlas para el post-procesamiento:

SELECT * 
FROM `foo` 
WHERE (`id_obj` , `Foo_obj`) 
IN (
    SELECT `id_obj` , `Foo_obj` 
    FROM `foo` 
    GROUP BY `id_obj` , `Foo_obj` 
    HAVING count(*) > 1 
)