Vinzenz Mai: mysql Addieren von 2 Ergebnissmengen möglich?

Beitrag lesen

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