Um Zeilen aus people
, wo nicht eine Reihe dort zu diesen people
und einer bestimmten Zeile in info
verwendet ist, können Sie ein Anti-Join Muster verwenden.
Zum Beispiel:
SELECT p.id AS `person_id`
, p.people_name AS `person_name`
FROM people p
LEFT
JOIN people_info i
ON i.people_id = p.id
AND i.info_id = ?
WHERE i.people_id IS NULL
ORDER BY p.id
Dies ist nicht die einzige Abfrage Muster, das dieses Ergebnis zurückgibt. Es gibt ein paar andere, zum Beispiel eine nicht mit EXISTS und korrelierte Unterabfrage:
SELECT p.id AS `person_id`
, p.people_name AS `person_name`
FROM people p
WHERE NOT EXISTS (SELECT 1
FROM people_info i
WHERE i.people_id = p.id
AND i.info_id = ?
)
ORDER BY p.id
Wenn Sie alle (people,info)
Tupel zurückgeben möchten, die nicht verwandt sind, sondern als ein nur einem einzigen info
, das kann auch erreicht werden. Die angegebene Spezifikation ist nicht eindeutig, welche Werte bereitgestellt werden, und ein Beispiel für die erwartete Ausgabe. Die obige Antwort bezieht sich nur auf eine von mehreren möglichen Interpretationen.
Wenn wir alle drei Tabellen einbeziehen wollen ... alle Infos für alle Menschen zu bekommen, die noch nicht gemeldet wurden, können wir eine verwenden anti-join Muster:
SELECT p.id AS `person_id`
, p.people_name AS `person_name`
, i.id AS `info_id`
, i.info_name AS `info_name`
FROM people p
CROSS
JOIN info i
LEFT
JOIN people_info n
ON n.people_id = p.id
AND n.info_id = i.id
WHERE n.people_id IS NULL
ORDER BY p.id, i.id
können Sie Probe hinzufügen Datensatz wird es helfen, zu untersummieren –
Überprüfen Sie die Beispieltabelle Bild? mit wenigen Beispieldaten – Aelaf
können Sie es an Frage –