2012-04-11 5 views
7

übereinstimmen sollte ich die Abfrage:Mysql Wo ... In ... und wo ... in ... nur auf denselben Index

SELECT * FROM `users` 
WHERE (`firstname` LIKE 'Luke' AND `lastname` LIKE 'Skywalker') OR 
(`firstname` LIKE 'Foo' AND `lastname` LIKE 'Bar') OR 
(`firstname` LIKE 'Tom' AND `lastname` LIKE 'Turner'); 

Aber ich möchte es ein bisschen besser lesbar machen durch einen wo mit ... in ... habe ich versucht,

SELECT * FROM users 
WHERE `firstname` 
    IN ('Luke','Foo','Tom') AND `lastname` IN ('Skywalker','Bar','Turner'); 

Aber leider wird dies auch "Tom Skywalker" passen, "Foo Turner" und alle mischt man denken weg kann.

Ich muss auf Vor- und Nachname (vielleicht mehr Felder wie DOB) auswählen, da ich Daten von einer externen API bekomme und ich muss überprüfen, ob diese Namen in unserem System sind.

+0

Wie groß ist der Umfang der Daten in Ihrer Tabelle "users" und die Anzahl der Zeilen der externen API, die Sie vergleichen müssen? 100 Zeilen? 50.000 Reihen? – mellamokb

+0

Ich kann bis zu 1000 Namen von der externen API zurückbekommen (ich möchte Facebook-Freunde mit Benutzern aus meiner eigenen Datenbank verbinden) meine eigene Datenbank kann bis zu 10000 Zeilen bekommen (sie befindet sich derzeit in einer Testphase, aber ich möchte sie optimieren alle meine SQL-Abfrage ist in einem frühen Stadium) – Werring

Antwort

4
SELECT * 
FROM users 
WHERE (firstname, lastname) 
     IN (('Luke', 'Skywalker') 
     , ('Foo' , 'Bar') 
     , ('Tom' , 'Turner') 
     ) 
; 
+1

+1, ich kannte diese Syntax nicht – safarov

+0

@safarov: Gültig in MySQL, Postgres und Oracle 11g. Nicht im Sql-Server. –

3

Sie können sie mit concat kombinieren:

WHERE concat(`firstname`,'-',`lastname`) 
    IN ('Luke-Skywalker', 'Foo-Bar', 'Tom-Turner'); 
+2

Das Problem mit dieser Lösung ist, dass es ziemlich langsam sein wird –

+1

Dies kann lesbarer sein, wird aber auch langsamer sein. –

+0

Guter Punkt. Ich habe der Frage einen Klärungsbemerkung hinzugefügt. Wenn der Datensatz klein ist, würde ich die Lesbarkeit der Leistung vorziehen. – mellamokb

4

Mit LIKE Operator ohne Platzhalter nicht viel Sinn machen. Ich denke du solltest = verwenden, besonders wenn du check if those names are in our system haben musst.

SELECT * FROM users 
WHERE (firstname = 'Luke' AND lastname = 'Skywalker') OR 
     (firstname = 'Foo' AND lastname = 'Bar') OR 
     (firstname = 'Tom' AND lastname = 'Turner') 

Wenn Sie einen IN Operator verwenden, wie Sie gesagt haben, werden verschiedene Kombinationen entsprechen. Ich denke, das vorherige Beispiel sollte der schnellste Weg sein, sie zu vergleichen.