Eine MySQL -Abfrage, die sich mit drei Tabellen befasst: Wie viele von A sind nicht in B oder C?

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

  •  28-10-2019
  •  | 
  •  

Frage

Ich habe ein Problem mit der Formulierung einer MySQL -Abfrage, um die folgende Aufgabe zu erledigen, obwohl ich hier ähnliche Abfragen gesehen habe, die hier diskutiert sind, sie unterscheiden sich ausreichend von diesem, um meine Versuche, sie zu übertragen, zu Snooker. Das Problem ist (ziemlich) einfach zu sagen. Ich habe drei Tabellen, "Mitglieder", "Dog_shareFered" und "Dog_sharewanted". Mitglieder haben möglicherweise keine oder mehrere Anzeigen für Dinge, die sie verkaufen oder kaufen möchten, und die Details werden in der entsprechenden angebotenen oder gesuchten Tabelle zusammen mit der ID des Mitglieds gespeichert, das die Anzeige platziert hat. Die Spalte 'ID' ist einzigartig für das Mitglied und gemeinsam für alle drei Tabellen. Die Frage, die ich möchte, ist zu fragen, wie viele Mitglieder keine Anzeige in einen beiden Tisch gestellt haben.

Ich habe verschiedene Möglichkeiten versucht, dies zu fragen. Das nächste, was ich bekommen kann, ist eine Frage, die nicht abstürzt! (Ich bin keineswegs ein MySQL -Experte). Das Folgende habe ich von dem zusammengestellt, was ich aus anderen Beispielen entnommen habe, aber es gibt keine Zeilen zurück, wo ich weiß, dass das Ergebnis größer als Null sein sollte.

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)

Diese Abfrage sieht angenehm einfach zu verstehen, im Gegensatz zu den "Join's", das ich gesehen habe, aber ich vermute, dass ich vielleicht eine Art Join brauche, aber wie würde das in diesem Fall aussehen?

War es hilfreich?

Lösung

Wenn Sie keine Anzeigen in wollen entweder Tabelle, dann die Art von Abfrage, nach der Sie suchen, ist:

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

Auswahl von IDs aus anderen Tabellen:

SELECT id
FROM <othertable>

Somit:

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

Ich habe das 'SELECT DISECTION' hinzugefügt, weil ein Mitglied viele Anzeigen in Anspruch genommen hat, aber es gibt nur eine ID. Ich hatte früher eine SELECT DISTINCT In den obigen Unterabfragen ist dies jedoch nicht erforderlich.

Wenn Sie ein Unterbild vermeiden möchten (je nachdem, je nach ..), könnten Sie einige linke Zusammenhänge verwenden:

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

Warum das funktioniert:

Es nimmt den Tisch members und schließt es mit den beiden anderen Tischen auf der id Säule. Das LEFT JOIN bedeutet, dass wenn ein Mitglied in der existiert members Tisch aber nicht Die Tabelle, mit der wir uns anschließen (zB (zB) dog_shareoffered), dann die entsprechende dog_shareoffered Spalten haben haben NULL in ihnen.

Also die WHERE Der Zustand nimmt Reihen aus, bei denen es ein gibt NULL ID in beiden dog_shareoffered und dog_sharewanted, was bedeutet, dass wir IDs in gefunden haben members ohne entsprechende ID in den beiden anderen Tabellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top