Frage
Ich habe drei Tabellen:Seite, Anhang, Seitenanhang
Ich habe Daten wie diese:
page
ID NAME
1 first page
2 second page
3 third page
4 fourth page
attachment
ID NAME
1 foo.word
2 test.xsl
3 mm.ppt
page-attachment
ID PAGE-ID ATTACHMENT-ID
1 2 1
2 2 2
3 3 3
Ich möchte die Anzahl der Anhänge pro Seite erhalten auch wenn diese Zahl 0 ist.Ich habe es versucht mit:
select page.name, count(page-attachment.id) as attachmentsnumber
from page
inner join page-attachment on page.id=page-id
group by page.id
Ich erhalte diese Ausgabe:
NAME ATTACHMENTSNUMBER
second page 2
third page 1
Ich möchte diese Ausgabe erhalten:
NAME ATTACHMENTSNUMBER
first page 0
second page 2
third page 1
fourth page 0
Wie bekomme ich den 0-Teil?
Lösung
Ändern Sie Ihren „inneren Join“ in einen „linken äußeren Join“, was bedeutet: „Erhalte alle Zeilen auf der linken Seite des Joins, auch wenn es auf der rechten Seite keine passende Zeile gibt.“
select page.name, count(page-attachment.id) as attachmentsnumber
from page
left outer join page-attachment on page.id=page-id
group by page.name
Andere Tipps
Hier ist eine weitere Lösung mit Unterabfragen.
SELECT
p.name,
(
SELECT COUNT(*) FROM [page-attachment] pa
WHERE pa.[PAGE-ID] = p.id
) as attachmentsnumber
FROM page p
Je nach Datenbank können Sie aus Geschwindigkeitsgründen den Befehl UNION verwenden.
Die SQL-Anweisung ist zwar länger, aber abhängig von der Datenbank beschleunigt sie die Arbeit durch die Trennung von „Dinge zählen, die vorhanden sind“ und „Dinge zählen, die nicht vorhanden sind“.
(
select page.name, count(page-attachment.id) as attachmentsnumber
from page
inner join page-attachment on page.id=page-id
group by page.id
)
UNION
(
select page.name, 0 as attachmentsnumber
from page
where page.id not in (
select page-id from page-attachment)
)
Die Datenbank, für die ich diese Lösung benötige, umfasst 20 Seiten mit mehr als einer Million Anhängen.Die UNION hat dafür gesorgt, dass die Ausführung in 13 Sekunden statt so lange dauerte, bis mir langweilig wurde und ich einen anderen Weg versuchte (irgendwo über 60 Sekunden, bevor ich die Outer-Join- und Subquery-Methoden beendete).
Sie möchten einen Links-Join anstelle eines Inner-Joins, da dadurch Datensätze nicht vorhanden sein können.
LINKS beitreten ist dein Freund.Weitere Informationen zu den verschiedenen Join-Typen finden Sie unter http://en.wikipedia.org/wiki/Join_(SQL)
Benutze das:
SELECT p.name,(
SELECT COUNT(*) FROM [page-attachment] pa WHERE pa.[PAGE-ID] = p.id) as attachmentsnumber
FROM page p