Berikut adalah cara umum untuk melakukan kueri ini tanpa menggunakan metode subkueri yang Anda tunjukkan. Ini mungkin memenuhi permintaan @Godeke untuk melihat solusi berbasis gabungan.
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;
Namun, di sebagian besar merek database, solusi ini dapat berkinerja lebih buruk daripada solusi subquery. Sebaiknya gunakan EXPLAIN untuk menganalisis kedua kueri, untuk melihat mana yang lebih baik berdasarkan skema dan data Anda.
Berikut variasi lain pada solusi subquery:
SELECT *
FROM movies m
WHERE NOT EXISTS (SELECT * FROM seen s
WHERE s.movie_id = m.id
AND s.user_id=123);
Ini adalah subkueri yang berkorelasi, yang harus dievaluasi untuk setiap baris kueri luar. Biasanya ini mahal, dan kueri contoh asli Anda lebih baik. Di sisi lain, di MySQL "NOT EXISTS
" seringkali lebih baik daripada "column NOT IN (...)
"
Sekali lagi, Anda harus menguji setiap solusi dan membandingkan hasilnya untuk memastikan. Membuang-buang waktu untuk memilih solusi apa pun tanpa mengukur kinerja.