2013-08-08 16 views
8

w poniżej polecenia sql chcę użyć DESC po WHEN 1 THEN i.id linii. Chcę jeśli sortable pole jest 1 następnie uporządkuj musi mieć jak tego polecenia,Mysql używać DESC w przypadku oświadczenie

ORDER BY i.id DESC 

Mysql:

SELECT 
    SQL_CALC_FOUND_ROWS i.* , 
    c.title AS category_name, 
    u.name, 
    u.family, 
    i.thumb_image, 
    CONCAT(u.name, ' ', u.family) AS author, 
    tumbnail_image_width, 
    tumbnail_image_height 
    FROM contents i 
    JOIN categories c ON c.id = i.category 
    JOIN users u ON u.id = i.posted_by 
    JOIN settings s ON s.portal = i.portal 
    WHERE 
     i.portal = '{$portal_id}' 
     AND CASE WHEN post_type = 4 
       THEN date(NOW()) BETWEEN i.from_dateTime AND i.to_dateTime 
     ELSE post_type = 1 
     END 
    AND i.t_status = 1 
    ORDER BY 
    CASE (SELECT sortable FROM settings) 
     WHEN 1 THEN i.id 
     WHEN 2 THEN i.date_time 
     WHEN 3 THEN i.order_display 
    END       
    LIMIT {$portalSettings['display_post_count']};"; 

Odpowiedz

2

Być może przywrócić pola sortowania w SELECT, a następnie sortowanie wg że nazwane pole: -

SELECT 
    SQL_CALC_FOUND_ROWS i.* , 
    c.title AS category_name, 
    u.name, 
    u.family, 
    i.thumb_image, 
    CONCAT(u.name, ' ', u.family) AS author, 
    tumbnail_image_width, 
    tumbnail_image_height, 
    CASE (s.sortable) 
     WHEN 1 THEN 100000000 - i.id 
     WHEN 2 THEN i.date_time 
     WHEN 3 THEN i.order_display 
    END AS SortField 
    FROM contents i 
    JOIN categories c ON c.id = i.category 
    JOIN users u ON u.id = i.posted_by 
    JOIN settings s ON s.portal = i.portal 
    WHERE 
     i.portal = '{$portal_id}' 
     AND CASE WHEN post_type = 4 
       THEN date(NOW()) BETWEEN i.from_dateTime AND i.to_dateTime 
     ELSE post_type = 1 
     END 
    AND i.t_status = 1 
    ORDER BY SortField     
    LIMIT {$portalSettings['display_post_count']};"; 

Pamiętaj, że aby to zrobić, konieczne może być przesłanie pól do typu danych.

+0

'MAX (i.id) - i.id + 1'? – hjpotter92

+0

Coś takiego może być bardziej elastyczne, mimo że używasz funkcji agregującej bez grupowania. Wystarczy użyć największej możliwej wartości id. Pamiętaj jednak, że możesz przesłać identyfikator do ciągu znaków i zrobić trochę skrzypiec, aby mieć ciągi posortowane w tej samej kolejności, co liczby (np. Może dodać zera wiodące) – Kickstart

Powiązane problemy