Hi!
Versteh ich nicht. Es ist doch lediglich der Name einer Tabelle durch das Subselect auszutauschen und ein Aliasname hinten dranzuhängen, wenn noch keiner da ist. Versuch doch mal konkret auf den Punkt zu bringen, wo genau dir noch Verständnis fehlt.
Ich weiß einfach nicht, welcher Teil der Query was efasst.
Eine Subquery ist (mit der Ausnahme der korrelierten) ein autarkes Gebilde. Sie liefert ein (skalares) einfaches Ergebnis oder eine Ergebnismenge. So eine Ergebnismenge bildet quasi eine temporäre Tabelle.
Um beim Beispiel zu bleiben:
SELECT t.monat, FROM_UNIXTIME(m.Unixstamp, '%Y|%m') AS ym
FROM tmp t
LEFT JOIN
(select count(ID) from meinetabelle
where
loesch != 1 AND
Status = 'xx'
) m //(kommt das Alias hinter die Klammer?)m ON t.Monat = m.ym
GROUP BY t.Monat DESC;
Ja, der Aliasname kommt hinter die Klammer, aber nur einer. Der Klammerausdruck ersetzt einen direkten Tabellennamen. Die Klammern halten die Syntax dieses Ausdrucks zusammen und der Alias kommt wie beim Tabellennamen hintendran.
> So geht es jedenfalls schonmal nicht, wenn ich mich erinnere. Ich sitze gerade am falschen Rechner, um das zu verifizieren, aber ich gkaube, mysql mckert dann, dass es m.Unixtimestamp nicht kennt.
Stimmt, denn die Subquery liefert keine solche Spalte zurück - muss und kann sie auch gar nicht. Zudem willst du ja eigentlich nur die bereits vorhandene Abfrage um die nicht vorhandenen Monate erweitern. Deshalb muss alles in die Subquery rein, was das bisherige Ergebnis geliefert hat. Das heißt, die Gruppierung muss in die Subquery und sich dann auch auf ein Feld der Subquery-Tabelle beziehen.
~~~sql
SELECT FROM_UNIXTIME(Unixstamp, '%Y|%m') ym, COUNT(*) anz
FROM meinetabelle
WHERE
loesch != 1 AND
Status = 'xx'
GROUP BY FROM_UNIXTIME(Unixstamp, '%Y|%m')
Das ist die Subquery, und sie muss das richtige Ergebnis ohne Leermonate liefern. Und an dieser Stelle gibts dann auch keinen Timestamp mehr sondern nur noch den formatierten Monatsstring.
SELECT t.monat, s.anz
FROM tmp t
LEFT JOIN
([die Subquery von oben]) s
ON t.Monat = s.ym
ORDER BY t.Monat DESC
Eine Sortierung braucht es in der Subquery nicht, stattdessen wird das Gesamtergebnis sortiert.
Wie auch immer, es ist jedenfalls ungünstig mit einer festen Tabelle zu arbeiten, denn die kann von mehreren gleichzeitig verwendet werden.
Da muss dann konkurrierender Zugriff abgesichert werden.
Fänd ich nicht schwer, denn es müsste nur überprüft werden, ob der richtige Inhalt in der Tabelle steht. Wenn ja,passiert gar nichts. Wenn nein, wird er hineingeschrieben. und zwar genau maximal 1 x im Monat.
Ok, in dem Fall kann es fast egal sein, ob da was kollidiert. Lediglich Zugriffe zwischen Löschen und erneutem Einfügen ergeben Mist. Wenn jeder Client hingegen eigene Zeiträume abfragt, kann man das nicht mehr einfach so auf die leichte Schulter nehmen.
Aber Du hast recht, wenn mein User temp. Tabellen anlegen kann, sollte ich das auch nutzen.
Auf jeden Fall. Das ist schon durch die implizite Bindung der Temp-Tabelle an die Client-Session bestens abgeschirmt.
P.S. Die Temp-Tabelle für die Monate benötigt keine ID-Spalte, da du sie nirgends verwendest.
Lo!