2012-04-11 3 views
0

Diese Frage bezieht sich auf meine vorherige Frage - MySQL query to show records with current date on top and others as per descending order. Die Abfrage i verwende jetzt,MySQL-Abfrage, um Datensätze zu bestellen ORDER BY

SELECT b.sales_id,b.category_id,b.sale_starts,b.sale_ends 
FROM tbl_sales b WHERE b.active=1 
UNION 
SELECT b.sales_id,b.category_id,b.sale_starts,b.sale_ends 
FROM tbl_sales b INNER JOIN tb_category c ON b.category_id=c.cat_id 
WHERE c.cat_keyword LIKE 'a' 
ORDER BY IF(sale_ends = DATE(NOW()), 0, 1), sale_ends DESC 

und die zurückgegebenen Ergebnisse sind wie folgt,

sales_id  | category_id   |sale_starts | sale_ends 
    ----------|---------------------|------------|-------------- 
    4  | 12    | 2012-04-05 | 2012-04-11 (today's date) 
    1  | 10    | 2012-03-31 | 2012-04-30  
    2  | 11    | 2012-03-22 | 2012-04-27 
    3  | 25    | 2012-03-31 | 2012-04-25 
    5  | 18    | 2012-04-05 | 2012-04-09 
    6  | 20    | 2012-02-23 | 2012-02-27 
    7  | 14    | 2012-02-25 | 2012-02-26 

aber jetzt bin ich mit einem anderen Problem stecken, und ich brauche die die Datensätze zu sortieren, wie unten gezeigt -

sales_id  | category_id   |sale_starts | sale_ends 
     ----------|---------------------|------------|-------------- 
     4  | 12    | 2012-04-05 | 2012-04-11 (today's date) 
     3  | 25    | 2012-03-31 | 2012-04-25 
     2  | 11    | 2012-03-22 | 2012-04-27 
     1  | 10    | 2012-03-31 | 2012-04-30 
     7  | 14    | 2012-02-25 | 2012-02-26 (expired/past dates) 
     6  | 20    | 2012-02-23 | 2012-02-27 
     5  | 18    | 2012-04-05 | 2012-04-09 

hatte ich versucht, ASC statt DESC in der Abfrage verwenden, aber dann die abgelaufenen Termine sind nur nach dem heutigen Datum aufgeführt. Ich brauche die Zukunftstermine nach dem heutigen Datum und danach nur noch die abgelaufenen Termine. Wie kann dies umgesetzt werden?

Brauchen Sie Hilfe. Vielen Dank im Voraus

Antwort

3

ORDER BY verarbeitet jede Bedingung in der Reihenfolge von links nach rechts. Also, wenn die Bestellung Sie brauchen so etwas wie „alle Einträge mit dem heutigen Datum, dann auf Einträge in der Zukunft aufsteigend von Datum, dann andere Einträge in aufsteigender Reihenfolge date“ ist, können Sie so etwas wie diese

ORDER BY (sale_ends=CURDATE()) DESC,(sale_ends>CURDATE()) DESC,sale_ends ASC 

tun Der Grund, warum die ersten beiden als DESC aufgelistet sind, besteht darin, dass die Bedingungen zu eins ausgewertet werden, wenn es wahr ist, und zu null, wenn es falsch ist. Da Sie die wahren Bedingungen zuerst haben möchten, müssen Sie sie in der Reihenfolge DESCending bestellen.

+0

Danke noch einmal, dass der Zweck erfüllt. –

1

Ich könnte etwas falsch verstehen, aber ist das nicht wonach Sie suchen?

order by sale_ends < curdate(), sale_ends 

Geige here.

+0

Danke für den Versuch –