2016-04-18 9 views
0

Für eine Anwendung, die ich mache, brauche ich die letzte Woche (Montag bis Freitag) und die Details für jeden Tag für jeden Benutzer, den ich in der Datenbank habe.Mysql - Kann ich die Klausel 'have' nach der Klausel 'order by' verwenden?

Für jetzt, meine Abfrage bekommt jeden Tag des Monats beginnend heute (Also, wenn wir die 18. sind, wird es 18.17-16 ... und so weiter) und der Monat davor (falls wir sind die ersten ...)

Aber ich möchte die Auswahl auf die ersten 8 Tage beschränken. Ich lese diese:

http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

Das letzte Beispiel ist, was ich zu tun werde versuchen. Aber das Problem ist, dass ich vorher eine order by machen muss. Ich muss nach Monaten (DESC), als nach Tagen (DESC) bestellen und dann muss ich die having tun, um zu bekommen, was ich will. Ich habe es ohne Bestellung versucht, es funktioniert gut, aber es kommt an die falschen Tage. Weil es standardmäßig ASC bestellt.

Nur für das Beispiel hier eine Abfrage ist, dass mein Problem darstellt, dann ist hier, was ich habe:

SELECT 
    day, id 
FROM 
    myTable 
WHERE 
    (month = EXTRACT(MONTH FROM CURRENT_TIMESTAMP) - 1 OR 
     month = EXTRACT(MONTH FROM CURRENT_TIMESTAMP) - 2) AND 
    year = EXTRACT(YEAR FROM CURRENT_TIMESTAMP) AND 
    day <= EXTRACT(DAY FROM CURRENT_TIMESTAMP) 
ORDER BY 
    month DESC, 
    day DESC; 

Hier ist, was ich will:

set @day := 0, @id:= ''; 

SELECT 
    day, id, @day := if(@id= id, @day + 1, 1) as day_number, 
    @id := id as dummy 
FROM 
    myTable 
WHERE 
    (month = EXTRACT(MONTH FROM CURRENT_TIMESTAMP) - 1 OR 
     month = EXTRACT(MONTH FROM CURRENT_TIMESTAMP) - 2) AND 
    year = EXTRACT(YEAR FROM CURRENT_TIMESTAMP) AND 
    day <= EXTRACT(DAY FROM CURRENT_TIMESTAMP) 
ORDER BY 
    month DESC, 
    day DESC 
HAVING 
    day_number <= 8; 

Aber ich kann nicht ein HAVING bringen können ein ORDER BY. Wenn ich die ORDER BY Klausel entferne, bekomme ich alle Tage für jede ID zwischen 1. und 8.. Aber ich brauche zwischen 18 und 10. (18. ist das aktuelle Datum)

Mit dem Code, den ich in der App habe, wird es nach einer Woche aufhören, so ist es egal, wenn die Auswahl von Sonntag bis Samstag zurückgibt, möchte ich nur mindestens Montag zu haben Freitag. Deshalb habe ich die Nummer "8" genommen, weil die App das nur montags ausführt.

Danke für jede Hilfe/Anregung!

Antwort

0

Sie können Ihre Abfrage in einer Unterabfrage wickeln und Filterung in der äußeren Abfrage durchführen:

SET @day := 0, @id:= ''; 

SELECT day, id, day_number 
FROM (
    SELECT 
     day, id, 
     @day := IF(@id = id, @day + 1, 
        IF(@id := id, 1, 1)) as day_number 
    FROM 
     myTable 
    WHERE 
     month = EXTRACT(MONTH FROM CURRENT_TIMESTAMP) - 1 OR 
     month = EXTRACT(MONTH FROM CURRENT_TIMESTAMP) - 2) AND 
     year = EXTRACT(YEAR FROM CURRENT_TIMESTAMP) AND 
     day <= EXTRACT(DAY FROM CURRENT_TIMESTAMP) 
    ORDER BY 
    month DESC, 
    day DESC) as t 
WHERE day_number <= 8; 

Die äußere Abfrage verwendet eine WHERE Klausel Filterung durchzuführen. HAVING wird in Verbindung mit GROUP BY und dem Operator auf Gruppenebene verwendet.

Hinweis: Die obige Abfrage verwendet geschachtelte Bedingungen, um die Variable @id richtig zu lesen/schreiben.

+0

Vielen Dank, ich werde es versuchen! Ich habe nie an eine Unterabfrage gedacht! – anthomaxcool

+0

Ist es möglich, dass die Methode 'day_number' falsch berechnet wird? Es gibt immer 1 – anthomaxcool

+0

@anthomaxcool Haben Sie Ihre Abfrage verwendet, um '@ ID' oder meine Version zu setzen? –