Dưới đây là một cách điển hình để thực hiện truy vấn này mà không sử dụng phương pháp truy vấn con bạn đã hiển thị. Điều này có thể đáp ứng yêu cầu của @ Godeke để xem giải pháp dựa trên tham gia.
SELECT *
FROM movies m
LEFT OUTER JOIN seen s
ON (m.id = s.movie_id AND s.user_id = 123)
WHERE s.movie_id IS NULL;
Tuy nhiên, trong hầu hết các thương hiệu của cơ sở dữ liệu, giải pháp này có thể hoạt động kém hơn giải pháp truy vấn phụ. Tốt nhất là sử dụng GIẢI THÍCH để phân tích cả hai truy vấn, để xem câu hỏi nào sẽ làm tốt hơn cho lược đồ và dữ liệu của bạn.
Đây là một biến thể của giải pháp subquery:
SELECT *
FROM movies m
WHERE NOT EXISTS (SELECT * FROM seen s
WHERE s.movie_id = m.id
AND s.user_id=123);
Đây là một subquery tương quan, mà phải được đánh giá cho mỗi hàng của truy vấn bên ngoài. Thông thường điều này là tốn kém, và truy vấn ví dụ ban đầu của bạn là tốt hơn. Mặt khác, trong MySQL "NOT EXISTS
" thường tốt hơn "column NOT IN (...)
"
Một lần nữa, bạn phải kiểm tra từng giải pháp và so sánh kết quả để chắc chắn. Đó là một sự lãng phí thời gian để chọn bất kỳ giải pháp mà không đo lường hiệu suất.
Nguồn
2009-02-13 00:05:51
Nếu nó không mở rộng, thì việc lập chỉ mục của bạn không hiệu quả. Chỉ số của bạn là gì? – dkretz
> Điều này hoạt động tốt nhưng dường như không quy mô rất tốt. Có cách tiếp cận tốt hơn cho điều này? Bạn đã thử EXPLAIN về truy vấn này chưa? – VolkerK