MySQLの次の表が、フォルダに含まれるドキュメントを記述していると仮定します。
mysql> select * from folder;
+----+----------------+
| ID | PATH |
+----+----------------+
| 1 | matches/1 |
| 2 | matches/2 |
| 3 | shared/3 |
| 4 | no/match/4 |
| 5 | unreferenced/5 |
+----+----------------+
mysql> select * from DOC;
+----+------+------------+
| ID | F_ID | DATE |
+----+------+------------+
| 1 | 1 | 2000-01-01 |
| 2 | 2 | 2000-01-02 |
| 3 | 2 | 2000-01-03 |
| 4 | 3 | 2000-01-04 |
| 5 | 3 | 2000-01-05 |
| 6 | 3 | 2000-01-06 |
| 7 | 4 | 2000-01-07 |
| 8 | 4 | 2000-01-08 |
| 9 | 4 | 2000-01-09 |
| 10 | 4 | 2000-01-10 |
+----+------+------------+
列IDは主キーであり、テーブルDOCの列F_IDは、テーブルFOLDERの主キーを参照するnull以外の外部キーです。where句でドキュメントの「DATE」を使用して、選択したドキュメントのみが含まれているフォルダを見つけたいと思います。2000-01-05より前のドキュメントの場合、これは次のように記述できます。
SELECT DISTINCT d1.F_ID
FROM DOC d1
WHERE d1.DATE < '2000-01-05'
AND d1.F_ID NOT IN (
SELECT d2.F_ID
FROM DOC d2 WHERE NOT (d2.DATE < '2000-01-05')
);
そしてそれは正しく「1」と「2」を返します。http://dev.mysql.com/doc/refman/5.5/en/rewriting-subqueries.htmlを読むことにより 、サブクエリを結合に置き換えると、大きなテーブルのパフォーマンスが向上する可能性があります。NOT INとJOINSに関連する質問はすでに見つかりましたが、探していたものとは異なります。それで、これを結合でどのように書くことができるかについてのアイデアはありますか?