MySQL und "partielle" Summe

MySQL, PostgreSQL, SQLite
EdRoxter
Posts: 483
Joined: 2006-01-06 03:23
Location: Neben Bonn

MySQL und "partielle" Summe

Post by EdRoxter » 2011-05-13 10:28

Hallo zusammen,

ich sitze hier grad vor einem Problemchen, zu dem ich einen Denkanstoß bräuchte.

Zwei Tabellen, technisch n:m, faktisch enthält sie aber nur Daten, die sich als 1:n beschreiben lassen.
Eine Tabelle "Vertrag", eine Tabelle "Parzelle", verknüpft via "VertragParzelle".
Einem Vertrag sind eine oder mehrere Parzellen zugeordnet, jeweils mit verschiedenen Eigenschaften.

Nun brauche ich eine Ausgabe aller Verträge mit bestimmten Eigenschaften und einigen Daten aller dazugehörigen Parzellen. Alles klappt wunderbar, bis auf:

Ein Feld in "Parzelle" ist die Flächenangabe dieser Parzelle. Ich brauche nun die Gesamtfläche der einem Vertrag zugewiesenen Parzellen, aber auch alle anderen Daten (wenn sie in der Ausgabe redundant drinstehen, ist das nicht weiter schlimm).

Wenn ich mit

Code: Select all

SELECT .., SUM(Parzelle.flaeche) AS Vertragsflaeche, ...
...
GROUP BY Vertrag.id

arbeite, bekomme ich zwar die gewünschte Gesamtfläche des Vertrags, aber natürlich nicht alle zu diesem Vertrag gehörigen Parzellen.

Was mir völlig reichen würde, wäre eine Ausgabe dieser Art:

Code: Select all

Vertrag.nr Vertrag.abschlussdatum Vertragsflaeche Parzelle.nr Parzelle.typ Parzelle.flaeche
12         12-12-2012             1.2             4           Bla          0.5
12         12-12-2012             1.2             382         Blubb        0.2
12         12-12-2012             1.2             1           Blibb        0.5
15         10-10-2010             0.8             42          Zonk         0.4
15         10-10-2010             0.8             9090        Irgendwas    0.4
39         11-11-2011             110             10          Dies         20
39         11-11-2011             110             13          Das          90


"Vertragsflaeche" soll für jeden Vertrag die Summe aller "Parzelle.flaeche" sein, das ganze klarerweise via INNER JOIN.

Hat jemand einen Hint?

Gruß, Nico

P.S.: Nur so, weil mir das neulich mal begegnet ist, aus reiner Neugierde: Welche Unterschiede gibt es bei SQLite via PHP5-PDO zwischen expliziter und impliziter INNER JOIN-Schreibweise? Auf einer ziemlich langsamen Gurke mit einer eher aufwändigen Query habe ich durch Wechsel von expliziter auf implizite Schreibweise über 100% Performancegewinn gehabt. Und ich habe tatsächlich nur das JOIN x ON y durch ein WHERE ersetzt, die Bedingungsklausel war inhaltlich die selbe.

EdRoxter
Posts: 483
Joined: 2006-01-06 03:23
Location: Neben Bonn

Re: MySQL und "partielle" Summe

Post by EdRoxter » 2011-05-13 11:29

Ha, Stichwort Subselect, genau... Das war mein fehlendes Gehirnstück, klappt nun alles super, danke für den Tritt! :)

Da die Query nicht regelmäßig ausgeführt wird, sondern nur bei Bedarf, und es sich um nicht allzu große Tabellen handelt (~50k Zeilen je, nur langsames Wachstum), die obendrein auch gut indiziert sind, ist Performance-Optimierung eher sekundär. Bei ein paar Testläufen komm ich auf 400ms im Schnitt raus, das reicht für meine Ansprüche vollkommen - zumal in meinem realen Fall aus insgesamt 8 Tabellen selected und wild gejoined wird. ;)

ad SQLite/PDO: Deine Vermutung klingt durchaus plausibel, ich werd mich da bei etwas mehr Zeit mal schlau machen. Die einzige mir bekannte Performancegeschichte von PDO sind Prepared Statements, die ich aber nicht eingesetzt habe, weil es sich nur um eine einzige Query handelte, die unmittelbar ausgeführt wurde.
Last edited by EdRoxter on 2011-05-13 11:30, edited 1 time in total.