2009-04-27 43 views
10

Tôi đang gặp khó khăn khi tìm kiếm một cách tốt hơn để tìm kiếm MySQL cho một cặp giá trị trong một bảng. Tôi có các cặp giá trị trong một mảng và muốn sao chép hàm IN(), nhưng với nhiều hơn 1 giá trị.MySQL IN() cho hai giá trị/mảng?

Ví dụ: được nhắm mục tiêu; Tôi có 3 cặp sau:

foo,1 
boo,2 
goo,3 

Các giải pháp hiện tại đặt tôi tại địa chỉ:

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

Tôi muốn nghĩ rằng có một nhiều hơn "sexy" giải pháp thấy rằng tôi có thể có bao nhiêu là một hàng trăm đôi và có điều đó có thể ORs loại làm cho tôi buồn nôn. Cảm ơn!!!

Trả lời

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

Cú pháp này có thể gây nhầm lẫn, và nó có thể dễ đọc hơn để thay thế nó với:

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

Tôi đang quen với một cựu, mặc dù :)

+0

đó làm việc tuyệt vời! Dường như rõ ràng bây giờ mà bạn đã nhìn thấy nó. – Typhon

+0

Đây chính xác là những gì tôi đang tìm kiếm! Tôi không biết .. Cảm ơn bạn đời! – Tenaciousd93

2

Nếu bạn có thể lấy giá trị của bạn vào một bảng tạm thời (bạn chỉ cần hai cột) một cách dễ dàng và nhanh chóng, bạn chỉ có thể INNER THAM GIA theo cách của bạn ở đó. Nếu không, bạn sẽ phải sử dụng phiên bản @Quassnoi.

0

Câu trả lời hay từ @Quassnoi và @KM !!!

Ngoài ra, bạn có thể nhận được bản sao cặp và chọn chúng cho post-processing:

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 
)