NOT INの使用:
SELECT w.*
FROM WIDGET w
WHERE w.widget_id NOT IN (SELECT c.widget
FROM CHOSEN c
WHERE c.user_id = $user_id)
NOT EXISTSの使用:
SELECT w.*
FROM WIDGET w
WHERE NOT EXISTS (SELECT NULL
FROM CHOSEN c
WHERE c.widget_id = w.widget_id
AND c.user_id = $user_id)
LEFT JOIN / IS NULL:
SELECT w.*
FROM WIDGET w
LEFT JOIN CHOSEN c ON c.widget_id = w.widget
AND c.user_id = $user_id
WHERE w.widget IS NULL
パフォーマンス:
比較された列(いずれかのテーブルのwidget_id)はnull可能ではなく、LEFT JOIN /ISNULLはMySQLで最高のパフォーマンスを発揮します 。 columnsはnull許容(値はNULLの可能性があります)、NOTINまたはNOTEXISTSのパフォーマンスが向上します 。