Jörg: mysql, Query optimieren

Beitrag lesen

Hallo Rolf.

erstmal vielen lieben Dank, dass Du Dich meines Problems annimmst.

(1) GROUP BY und SUM

Hm...wußte ich nicht. 😕

Ob dein MySQL nämlich

ID  Name   Wert
 1  Hugo    11
 2  Paul     3
 3  Lisa    10

oder

ID  Name   Wert
 1  Otto    11
 2  Paul     3
 3  Lara    10

liefert, ist undefiniert!!!1!1!!!elf!!1!

Oh...

In deinem Fall gibt es einen einfachen Ausweg, weil Du nur eine Spalte summierst und die ze Tabelle nur für diesen Zweck joinst.

Du kannst diesen JOIN sowie den GROUP BY weglassen und statt dessen diesen Subselect verwenden:

...
k.kdel,
(SELECT SUM(ze.Bruttozahlung) 
     FROM _table_zahlungseingang ze 
     WHERE ze.RechnungenID = r.RechnungenID) as BruttoSumme,
rz.GesamtRetoure
...

Habe ich gemacht, hat aber vergleichsweise wenig gebracht.

Berechneten Spalten einen Aliasnamen zu geben ist übrigens guter Brauch, dann kannst Du sie nachher im PHP auch namentlich verwenden und musst nicht mit Spaltennummern arbeiten.

Ich arbeite tatsächlich fast imme mit Nummern... eine Angewohnheit... 😉

(2) _table_mahnungen

Was ich nicht verstehe, ist der JOIN der Mahnungen.

LEFT JOIN _table_mahnungen m
    ON ( r.RechnungenID = m.RechnungenID AND m.aktiv = 1)
      AND m.RechnungenID = (SELECT MAX(tmp.RechnungenID)
                            FROM _table_mahnungen tmp
                            WHERE tmp.RechnungenID = r.RechnungenID AND m.aktiv = 1)

MAX(tmp.RechnungenID) muss immer gleich r.RechnungenID sein, weil andere Rows nicht selektiert werden. Es könnte höchstens sein, dass _table_mahnungen keinen einzigen Satz zu dieser RechnungenID enthält, aber den Fall fängt schon die erste Join-Bedingung, vor dem AND, ab. Der ganze AND-Teil erscheint mir nutzlos und der Subselect darin dann auch.

Liegt daran, dass es zu jeder Rechnung mehr als 1 Mahnung geben kann, die sich nach Mahnstufe unterscheiden und ich immer die höchste Mahnstufe nehmen wollte... ist aber vermutlich für den JOIN eh egal, oder?

(3) _table_berechnungen

Ob der LEFT JOIN der Tabelle _table_berechnungen nötig ist, weißt nur Du. Dein gezeigtes SQL verwendet keine Spalte aus dieser Tabelle.

Nein, die war nicht nötig...keine Ahnung, war die noch drin stand...ver,mu tlich hatte ich irgendwann mal nen Wert aus dsieser Tabelle genutzt, der aber weggefallen ist. Das Herausnehmen dieses JOINS hat sehr viel gebracht. Sicher 5 Sekunden oder so...

Leider bringts trotzdem unterm Strich nicht soviel, wie gewünscht, weil wohl auch mein PHP-Teil ziemlich viel Arbeit leisten muss. Da werde ich also auch nochmal ran müssen.

SQL mäßig bin ich jedenfalls durch Deine Hilfe schonmal auf ca. 1,5 Sek (von ca.7 sec) runter... danke!

Damit hast Du schonmal eine Menge Arbeit, hoffentlich nötzt se was.

Warum fällt mir hierzu die Feuerzangenbowle ein? War da mal was? 😉

Jörg