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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top