Kalle_B: Einträge einer zweiten Tabelle zählen

Hallöle,

ich habe eine Adresstabelle Jede Adresse kann in einer zweiten Tabelle 0..n zugehörige Termine haben. Ich möchte die Anzahl der Termine wissen.

SELECT
 adr.*
,count(trm.id) anz_termine
FROM      adressen adr
LEFT JOIN termine  trm ON trm.veranstalter_id = adr.id
GROUP BY  adr.id

Durch den LEFT JOIN wird die Anzahl der gefundenen Adresssätze potenziert und ich muss sie mit GROUP BY wieder reduzieren.

Geht das nicht eleganter und direkter? Irgendwie die Adressen holen und pro Adresse die Summe?

Gruß, Kalle

  1. Hi,

    Geht das nicht eleganter und direkter? Irgendwie die Adressen holen und pro Adresse die Summe?

    ja, per Subselect. Ob das der Performance des Statements gut tut, musst Du testen.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. moin,

    Geht das nicht eleganter und direkter? Irgendwie die Adressen holen und pro Adresse die Summe?

    mal davon abgesehen, das jede andere dbms ausser mysql bei der abfrage eine fehlermeldung ausgibt, gibt es sicherlich eine elegantere lösung, nämlich mit einer korrelierten unterabfrage, die auch überall funkioniert. und mich würde es auch nicht wundern, wenn diese wesentlich performanter ist.

    SELECT adr.*,
          (SELECT COUNT(*)
           FROM termine t
           WHERE t.veranstalter_id = a.id
          ) anz_termine
    FROM adressen a
    ;

    Ilja

    1. Hallo, Ilja,

      SELECT adr.*,
            (SELECT COUNT(*)
             FROM termine t
             WHERE t.veranstalter_id = a.id
            ) anz_termine
      FROM adressen a

      Danke, das sieht vernünftig aus. Bei 197 Adressen und 820 Terminen erhöht der Subselect die Programmlaufzeit von 1,5 auf 2,2 sec.

      Und wenn ich dann noch einen Key auf veranstalter_id lege, bleibt's bei 1,5

      Kalle