Utiliser 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)
Utiliser NON 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)
JOINTURE GAUCHE/EST 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
Performances :
Si le les colonnes comparées (widget_id dans l'une ou l'autre table) ne sont pas nullables, LEFT JOIN/IS NULL fonctionne le mieux sur MySQL . Si le les colonnes sont nullables (la valeur peut être NULL), NOT IN ou NOT EXISTS fonctionnent mieux .