2012-04-11 1 views
7

У меня есть запрос:Mysql Где ... В ... И где ... в ... должен соответствовать только на том же индексе

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'); 

Но я хотел бы сделать его немного более удобным для чтения используя куда ... в ... Я попытался

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

Но, к сожалению, это также будет соответствовать "Tom Skywalker", "Foo Turner" и все перемешивает вы можете думать прочь.

Мне нужно выбрать на первом и последнем имени (возможно, больше полей, таких как DOB), так как я получаю данные от внешнего API, и мне нужно проверить, находятся ли эти имена в нашей системе.

+0

Каков масштаб данных в вашей таблице 'users' и количестве строк из внешнего API, которые вам придется сравнивать? 100 строк? 50 000 строк? – mellamokb

+0

Я могу получить до 1000 имен обратно из внешнего API (я хочу совместить друзей facebook с пользователями из моей собственной базы данных), моя собственная база данных может получить до 10000 строк (в настоящее время она находится в фазе тестирования, но я хочу оптимизировать все мои запросы sql на ранней стадии) – Werring

ответ

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

+1, я не знал этого синтаксиса – safarov

+0

@safarov: Действителен в MySQL, Postgres и Oracle 11g. Не в Sql-сервере. –

3

Вы можете комбинировать их с concat:

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

Проблема с этим решением заключается в том, что он будет довольно медленным. –

+1

Это может быть более читаемым, но также будет медленнее. –

+0

Хорошая точка. Я добавил комментарий к вопросу. Если набор данных невелик, я бы предпочел читабельность производительности. – mellamokb

4

Использование LIKE оператора без маски не имеет особого смысла. Я думаю, вы должны использовать =, особенно если у вас есть check if those names are in our system.

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

Если вы используете IN оператора, как вы сказали, будут соответствовать разные комбинации. Я думаю, что предыдущий пример должен быть самым быстрым способом их сравнения.

Смежные вопросы