Usando NO EN:
SELECT w.*
FROM WIDGET w
WHERE w.widget_id NOT IN (SELECT c.widget
FROM CHOSEN c
WHERE c.user_id = $user_id)
Usando NO EXISTE:
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)
INCORPORACIÓN IZQUIERDA/ES NULO:
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
Rendimiento:
Si las columnas comparadas (widget_id en cualquiera de las tablas) no admiten valores NULL, LEFT JOIN/IS NULL funciona mejor en MySQL . Si las columnas admiten valores NULL (el valor podría ser NULL), NOT IN o NOT EXISTS funcionan mejor .