示したサブクエリメソッドを使用せずにこのクエリを実行する一般的な方法を次に示します。これは、参加ベースのソリューションを見たいという@Godekeの要求を満たす可能性があります。
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;
ただし、ほとんどのブランドのデータベースでは、このソリューションはサブクエリソリューションよりもパフォーマンスが低下する可能性があります。 EXPLAINを使用して両方のクエリを分析し、スキーマとデータを考慮してどちらがより適切に機能するかを確認することをお勧めします。
サブクエリソリューションの別のバリエーションは次のとおりです。
SELECT *
FROM movies m
WHERE NOT EXISTS (SELECT * FROM seen s
WHERE s.movie_id = m.id
AND s.user_id=123);
これは相関サブクエリであり、外部クエリのすべての行に対して評価する必要があります。通常、これは費用がかかるため、元のサンプルクエリの方が適しています。一方、MySQLでは「NOT EXISTS
多くの場合、「column NOT IN (...)
よりも優れています "
ここでも、各ソリューションをテストし、結果を比較して確認する必要があります。 パフォーマンスを測定せずにソリューションを選択するのは時間の無駄です。