Une requête MySQL portant sur trois tableaux: Combien de A ne sont pas en B ou C?

StackOverflow https://stackoverflow.com/questions/9355066

  •  28-10-2019
  •  | 
  •  

Question

J'ai un problème de formuler une requête MySQL pour faire la tâche suivante, bien que je l'ai vu des requêtes similaires ont discuté ici, ils sont suffisamment différents de celui-ci pour snooker mes tentatives de les transposer. Le problème est (assez) simple à énoncer. J'ai trois tables, 'membres', 'dog_shareoffered' et 'dog_sharewanted'. Les membres peuvent avoir zéro, une ou plusieurs annonces pour des choses qu'ils veulent vendre ou veulent acheter, et les détails sont stockés dans le tableau offert ou voulu correspondant, ainsi que l'identifiant du membre qui a placé l'annonce. La colonne « id » est unique au membre, et commune à tous les trois tables. La requête que je veux est de demander combien de membres ont pas placé une annonce dans les deux tables.

J'ai essayé plusieurs façons de poser cela. Le plus proche que je peux obtenir est une requête qui ne tombe pas en panne! (Je ne suis pas un expert MySQL par tout moyen). Ce qui suit, je l'ai mis en place de ce que je glané d'autres exemples, mais il ne renvoie aucune ligne, où je sais que le résultat devrait être supérieur à zéro.

SELECT id 
  FROM members 
 WHERE id IN (SELECT id 
                FROM dog_sharewanted 
               WHERE id IS NULL) 
   AND id IN (SELECT id 
                FROM dog_shareoffered 
               WHERE id IS NULL)

La requête ressemble plaisamment simple à comprendre, contrairement à la « REJOIGNEZ de » Je l'ai vu, mais je devine que peut-être je besoin d'une sorte de Join, mais comment ce regard dans ce cas?

Était-ce utile?

La solution

Si vous voulez pas d'annonces dans soit table, le genre de requête que vous êtes après est:

SELECT id
FROM members
WHERE id NOT IN ( any id from any other table )

Pour sélectionner ids d'autres tables:

SELECT id
FROM <othertable>

Par conséquent:

SELECT id
FROM members
WHERE id NOT IN (SELECT id FROM dog_shareoffered)
 AND  id NOT IN (SELECT id FROM dog_sharewanted)

I ajouté le 'SELECT DISTINCT parce qu'un membre peut mettre dans de nombreuses annonces, mais il n'y a qu'un seul identifiant. Je l'habitude d'avoir un SELECT DISTINCT dans les sous-requêtes ci-dessus, mais comme commentaires ci-dessous mention, c'est pas nécessaire.

Si vous voulez éviter une sous-requête (une augmentation possible de la performance, en fonction ..), vous pouvez utiliser une partie gauche JOIN:

SELECT members.id
FROM members
LEFT JOIN dog_shareoffered
 ON dog_shareoffered.id = members.id
LEFT JOIN dog_sharewanted
 ON dog_sharewanted.id = members.id
WHERE dog_shareoffered.id IS NULL
  AND dog_sharewanted.id IS NULL

Pourquoi ce travaux:

Il faut la table members et se joint à deux autres tables sur la colonne id. Les moyens de LEFT JOIN que si un membre existe dans la table de members mais pas la table, nous nous associons à (par exemple dog_shareoffered), les colonnes de dog_shareoffered correspondantes auront NULL en eux.

Alors, les choix de l'état de WHERE sur les lignes où il y a un id NULL dans les deux dog_shareoffered et dog_sharewanted, ce qui signifie que nous avons trouvé dans ids members sans id correspondant dans les deux autres tables.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top