2012-04-11 33 views
7

Tôi có truy vấn:Mysql ở đâu ... Trong ... VÀ nơi ... trong ... nên chỉ phù hợp trên cùng một chỉ số

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

Nhưng tôi muốn làm cho nó dễ đọc hơn một chút bằng cách sử dụng một nơi ... trong ... tôi đã cố gắng

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

Nhưng tiếc là điều này cũng sẽ phù hợp với "Tom Skywalker", "Foo Turner" và tất cả trộn bạn có thể nghĩ ra.

Tôi phải chọn tên và họ (có lẽ nhiều trường như DOB) vì tôi đang nhận dữ liệu từ API bên ngoài và tôi phải kiểm tra xem các tên đó có nằm trong hệ thống của chúng tôi hay không.

+0

Tỷ lệ dữ liệu trong bảng 'người dùng' của bạn là gì và số hàng từ API bên ngoài mà bạn sẽ phải so sánh? 100 hàng? 50.000 hàng? – mellamokb

+0

Tôi có thể nhận được tối đa 1000 tên từ API bên ngoài (Tôi muốn kết hợp bạn bè trên facebook với người dùng từ cơ sở dữ liệu của riêng mình) cơ sở dữ liệu của riêng tôi có thể nhận được tối đa 10000 hàng (hiện đang trong giai đoạn thử nghiệm, nhưng tôi muốn tối ưu hóa tất cả các truy vấn sql của tôi ở giai đoạn đầu) – Werring

Trả lời

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

+1, tôi không biết cú pháp này – safarov

+0

@safarov: Hợp lệ trong MySQL, Postgres và Oracle 11g. Không có trong Sql-Server. –

3

Bạn có thể kết hợp chúng với concat:

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

Vấn đề với giải pháp này là nó sẽ khá chậm –

+1

Điều này có thể dễ đọc hơn nhưng cũng sẽ chậm hơn. –

+0

Điểm tốt. Tôi đã thêm nhận xét làm rõ cho câu hỏi. Nếu tập dữ liệu nhỏ, tôi thích khả năng đọc hiệu suất hơn. – mellamokb

4

Sử dụng LIKE điều hành mà không cần ký tự đại diện không có ý nghĩa nhiều. Tôi nghĩ bạn nên sử dụng =, đặc biệt nếu bạn phải 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') 

Nếu bạn sử dụng toán tử IN, như bạn đã nói, sẽ khớp với các kết hợp khác nhau. Tôi nghĩ rằng ví dụ trước nên là cách nhanh nhất để so sánh chúng.

Các vấn đề liên quan