Eine MySQL -Abfrage, die sich mit drei Tabellen befasst: Wie viele von A sind nicht in B oder C?
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?
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.