11
votes

MySQL requête pour sélectionner tout sauf

J'ai deux tables MySQL.

Le premier est appelé "choisi" et consiste en des champs ID, user_id et widget_id.

L'autre s'appelle "widgets" et inclut plusieurs choses, y compris widget_id .

J'ai créé un filtre de sorte que l'utilisateur puisse afficher des widgets qu'il a choisi ou des widgets qu'il / elle n'a pas choisi. Pour ceux qu'il a choisi, j'utilise ceci: xxx

Cependant, je ne peux pas comprendre comment afficher ceux qu'il n'a pas choisi. Cela ne fonctionne pas (affiche tout): xxx

Comment puis-je faire cela?


0 commentaires

3 Réponses :


1
votes

logique booléenne: (ab) ' est identique que a' + b ' xxx


0 commentaires

0
votes

Fondamentalement, vous souhaitez sélectionner toutes les lignes de widgets qui n'ont pas de ligne associée dans choisi pour le $ $ $ user_id . Vous pouvez y accomplir avec une jointure extérieure à la recherche des lignes qui ne correspondaient pas dans la table choisies . Quelque chose comme ceci: xxx

BTW: Je recommande d'utiliser la nouvelle syntaxe de jointure sur la syntaxe des tables délimitées de virgule. Il est plus facile de lire et de comprendre, surtout quand il s'agit de jointures extérieures.


0 commentaires

19
votes

Utilisation non in:
   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


1 commentaires

Merci! J'ai fini par utiliser "Select * à partir de widgets w où w.widget_id pas dans (sélectionnez w.widget_id à partir de widgets w, choisi c, où c.widget_id = w.widget_id et c.user_id = $ user_id)"