2017-03-17 2 views
0

Ich versuche, meine Tabelle durch aktive Kampagne zuerst gefolgt mit der "EndDate" zu bestellen. Das bedeutet, dass neu erstellte Kampagnen immer an der Spitze stehen, gefolgt von dem Datum. Wenn die Kampagne endet, möchte ich, dass das neueste "endDate" ganz oben steht.MySQL Bestellung von "ID" zuerst dann von "Datum"

Hier ist meine Abfrage unter:

SELECT campaignId, 
     status, 
     dateCreated, 
     startDate, 
     endDate 
FROM  campaign 
WHERE deleted='False' 
ORDER BY DATE(endDate) > DATE(CURDATE()) DESC, campaignId DESC 

im Screenshot unten suchen, sind einige nicht von der „endDate“ bestellt (mit roten Kasten markiert) enter image description here

Der erste Teil richtig ist, die bedeutet, dass "endDate" nicht endet und zuerst nach id sortiert wird. Der letzte Teil ist jedoch falsch, beendete Kampagnen sollten nach dem "endDate" sortiert werden. Wo ich falsch gemacht habe?

aktualisieren SQL Fiddle (Bitte ignorieren WHERE deleted='False' bei der Verwendung): http://sqlfiddle.com/#!9/0a7afb

+0

Bitte erstellen Sie eine Geige auf http://sqlfiddle.com mit der Tabellenstruktur und den Beispieldaten zusammen mit dem erwarteten Ergebnis in die Frage. –

+0

Es ist erstellt ... bitte überprüfen Sie noch einmal – nodeffect

Antwort

0
SELECT 
    campaignId, status, dateCreated, startDate, endDate 
    FROM campaign 
    WHERE 
     deleted='False' 
    ORDER BY 
     DATE(endDate) DESC, campaignId DESC 

Diese funktionieren sollte.

Grundsätzlich brauchen Sie nicht > Zustand in Reihenfolge von.

Wenn Sie ein Filter für ein Datum größer als das aktuelle Datum haben möchten, sollte es in dem Zustand sein.

+0

Ich habe es versucht, es funktioniert nicht auch – nodeffect

+0

können Sie sqlfiddle Beispiel geben? – Akshay

+0

oben hinzugefügt, bitte einen Blick und ignorieren WHERE gelöscht = 'False' – nodeffect

1

ORDER BY DATE(endDate) > DATE(CURDATE()) DESC sagt, dass zukünftige Kampagnen zuerst gehen. Es sagt nicht in welcher Reihenfolge. Fügen Sie den Ausdruck in die select-Klausel ein und Sie werden sehen.

Sie können ORDER BY DATE(endDate) > DATE(CURDATE()) DESC, endDate DESC, campaignId DESC tun, aber der Ausdruck DATE(endDate) > DATE(CURDATE()) macht die Sortierung sehr langsam und verhindert die Verwendung eines Index. Außerdem müssen Sie DATE() in einer Datumsspalte nicht tun.

Wenn Sie eine separate Liste mit zukünftigen Kampagnen und früheren Kampagnen erstellen möchten, führen Sie zwei Abfragen aus, indem Sie die endDate-Bedingung in where clause setzen. Bei kleinen Datensätzen spielt das keine Rolle.

+0

Ich habe versucht, die obige Abfrage Sie bieten, es ist funktioniert auch nicht, es sortiert nur das Enddatum. – nodeffect

0

Ich habe das Problem gelöst, indem Sie "CASE" Anweisung verwenden. Für den Fall, dass jemand das nützlich findet.

SELECT 
    campaignId, status, dateCreated, startDate, endDate 
    FROM campaign 
    WHERE 
     deleted='False' 
    ORDER BY 
     CASE WHEN endDate > CURDATE() THEN campaignId END DESC, 
     CASE WHEN endDate < CURDATE() THEN DATE(endDate) END DESC 
+0

Um diese Frage als gelöst zu markieren, klicken Sie bitte auf das Häkchen neben der Antwort, die Sie bevorzugen. Es ist in Ordnung, Ihre eigene Antwort zu wählen, wenn Sie es wünschen. – halfer