Hallo,
Ich zitiere aus dem Handbuch:
To apply ORDER BY or LIMIT to an individual SELECT,
place the clause inside the parentheses that enclose the SELECT:
</seufz>
Was immer das genau heißen mag, ich vermute, ich darf ausschließlich gruppieren, aber nicht limitieren.
doch darfst Du, kannst Du. Wie's geht, habe ich doch ergänzt: Du musst die einzelnen SELECTS in Klammern (parentheses) setzen.
SELECT
gesamt.ym,
SUM(gesamt.zeit)
FROM (
( -- Du willst die Ergebnisse limitieren, also klammere
SELECT
FROM_UNIXTIME(JoggingTimestamp, '%Y%|%m') AS ym,
SUM(JoggingZeit) AS zeit
FROM
Jogging
WHERE
UserId ='1'
GROUP BY
ym
ORDER BY
ym DESC
LIMIT 12
)
UNION ALL
-- analoges Statement, weggelassen
) gesamt
GROUP BY
gesamt.ym
ORDER BY ym DESC
Nächster Punkt: LIMIT ist hier meiner Meinung nach der falsche Weg. Du möchtest die Daten der letzten 12 Monate. Was ist, wenn Du in einem Monat nicht im Kino warst oder nicht joggen konntest? Deine Abfrage versagt.
Du solltest den Zeitraum mit einer WHERE-Klausel einschränken, so dass Du auf die 12 gewünschten Monate kommst.
1 Frage: Wie denn? Über where timestamp between...?
prinzipiell ja. Nutze Umrechnungsfunktionen.
In beiden Fällen hast Du übrigens das "Problem", dass Monate, in denen Du weder im Kino warst, noch gejoggt hast, nicht in der Ergebnismenge auftauchen. Du kannst das in der API (hier PHP) lösen, Du kannst einfach einen LEFT OUTER JOIN auf eine Hilfstabelle machen. Und nein, wenn Du diesen Join ganz zum Schluss machst, ist das kein bisschen belastend. Ein Join einer "Tabelle" mit weniger als 12 Datensätzen mit einer Tabelle, die genau 12 Datensätze enthält, ist ein Klacks.
2 Frage: Ist das nicht sehr belastend für die db, wenn ich gar kein Limit setze?
Nein, selbstverständlich nicht. Dafür ist ein Index über die Timestamp-Spalte sehr nützlich.
Gelegentlich, aber auch nur gelegentlich kann LIMIT zur Optimierung genutzt werden, siehe von dedlfix verlinktes Optimierungskapitel. Es kann sogar vorkommen, dass LIMIT eine eklige Performancebremse wird :-)
Freundliche Grüße
Vinzenz