Câu trả lời được lựa chọn từ Martin Smith
SELECT PageID
FROM pagetags
WHERE TagID IN (1, 2, 4)
GROUP BY PageID
HAVING Count(DISTINCT TagID) = 3
là đúng nhưng nếu tốc độ là một vấn đề sau đó thử này.
Tôi có một bảng lớn làm điều tương tự và có hiệu suất tốt hơn 10x với những điều sau đây.
0,2 giây so với 2,0 giây đối với truy vấn trả về 272 từ bảng có 3 triệu hàng.
Cũng được thử nghiệm trên một bảng lớn hơn với 5 thẻ và cùng một 10x nhưng bây giờ 0,5 so với 5,0.
Chỉ mục là PageID, TagID với hàng triệu PageID và hàng trăm TagID.
Kịch bản chung nơi nhiều đối tượng được gắn thẻ thuộc tính đa giá trị.
SELECT distinct(p1.PageID)
FROM pagetags p1
JOIN pagetags p2
ON p2.PageID = p1.PageID
AND p2.TagID = 2
JOIN pagetags p3
ON p3.PageID = p1.PageID
AND p3.TagID = 4
WHERE p1.PageID = 1
ORDER BY p1.PageID
hoặc
SELECT distinct(PageID)
FROM pagetags
WHERE TagID = 1
INTERSECT
SELECT distinct(PageID)
FROM pagetags
WHERE TagID = 2
INTERSECT
SELECT distinct(PageID)
FROM pagetags
WHERE TagID = 4
ORDER BY PageID
thích cuối cùng như với hơn 5 gia nhập truy vấn tối ưu thường sẽ làm cho một số quyết định sai lầm.
Và với điều này đã không được sử dụng hết Group Bởi nếu bạn cần nó cho một tập hợp.
ok, tôi cần phải viết lược đồ ban đầu của mình vì nó khó hơn ví dụ trên :) nhưng bạn đã lưu tôi ở đó, cảm ơn một tấn. – Ali