2009-04-27 1 views
10

Ho difficoltà a trovare un modo migliore per cercare MySQL per una coppia di valori in una tabella. Ho le coppie di valori in una matrice e vorrei duplicare la funzione IN(), ma per più di 1 valore.MySQL IN() per due valori/array?

Ad esempio intenzionale; Ho le seguenti 3 coppie:

foo,1 
boo,2 
goo,3 

La soluzione attuale mi mette a:

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

mi piacerebbe pensare che ci sia una soluzione più "sexy" visto che avrei potuto avere fino a un un centinaio di coppie e avere questo tipo di OR può farmi venire la nausea. Grazie!!!

risposta

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

Questa sintassi può essere fonte di confusione, e può essere più leggibile per sostituirla con:

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

Sono abituato a quello precedente, però :)

+0

che funziona alla grande! Sembra così ovvio ora che tu l'ho visto. – Typhon

+0

Questo è esattamente quello che stavo cercando! Non lo sapevo .. Grazie amico! – Tenaciousd93

2

Se è possibile porta i tuoi valori in una tabella temporanea (ti servono solo le due colonne) in modo facile e veloce, puoi entrare INNER semplicemente a modo tuo. In caso contrario, dovrai utilizzare la versione di @Quassnoi.

0

Grandi risposte da @Quassnoi e @KM !!!

Inoltre, è possibile ottenere coppie duplicati e selezionarli per la post-elaborazione:

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 
)