2008-11-04 39 views
44

Vì vậy, tôi ', gỡ lỗi một số mã và có truy vấn SQL sau đây (đơn giản hóa từ những gì nó thực sự là).Cách chọn từ vị trí x bằng nhiều giá trị?

SELECT ads.*, location.county 
FROM ads 
LEFT JOIN location ON location.county = ads.county_id 
WHERE ads.published = 1 
AND ads.type = 13 
AND ads.county_id = 2 
OR ads.county_id = 5 
OR ads.county_id = 7 
OR ads.county_id = 9 

Tôi nhận được kết quả rất lạ từ truy vấn và tôi nghĩ kết quả của nó là vì OR đầu tiên phủ nhận AND trước đó. Vì vậy, tôi nhận được kết quả cho các quảng cáo thuộc mọi loại và không chỉ loại 13. Mỗi lần truy vấn được gọi là có thể có nhiều quận cần tìm kiếm hoặc chỉ một vài.

Bất kỳ trợ giúp nào về cách chính xác để thực hiện việc này đều sẽ được đánh giá cao.

Trả lời

98

Đặt dấu ngoặc xung quanh "OR" s:

SELECT ads.*, location.county 
FROM ads 
LEFT JOIN location ON location.county = ads.county_id 
WHERE ads.published = 1 
AND ads.type = 13 
AND 
(
    ads.county_id = 2 
    OR ads.county_id = 5 
    OR ads.county_id = 7 
    OR ads.county_id = 9 
) 

Hoặc thậm chí tốt hơn, sử dụng IN:

SELECT ads.*, location.county 
FROM ads 
LEFT JOIN location ON location.county = ads.county_id 
WHERE ads.published = 1 
AND ads.type = 13 
AND ads.county_id IN (2, 5, 7, 9) 
+7

Tôi nghĩ phiên bản IN dễ đọc hơn và ít có khả năng trả lại kết quả không mong muốn. – DOK

+4

nó cũng *** đáng kể *** nhanh hơn, ít nhất là trên MySQL – warren

+1

Trong trường hợp của tôi các giá trị trong 'IN' đến từ kết quả của một truy vấn chọn khác, làm cách nào để xử lý? –

17

Bạn có thể thử sử dụng dấu ngoặc xung quanh HOẶC biểu thức để đảm bảo truy vấn của bạn được giải thích chính xác hoặc chính xác hơn, hãy sử dụng IN:

SELECT ads.*, location.county 
FROM ads 
LEFT JOIN location ON location.county = ads.county_id 
WHERE ads.published = 1 
AND ads.type = 13 
AND ads.county_id IN (2,5,7,9) 
11

Và thậm chí đơn giản hơn khi sử dụng IN:

SELECT ads.*, location.county 
    FROM ads 
    LEFT JOIN location ON location.county = ads.county_id 
    WHERE ads.published = 1 
     AND ads.type = 13 
     AND ads.county_id IN (2,5,7,9) 
Các vấn đề liên quan