2013-08-08 18 views
8

nel comando sql sottostante voglio usare DESC dopo la riga WHEN 1 THEN i.id. voglio se sortable campo è 1 per poi dai deve essere hanno come questo comando,Mysql usa DESC nell'istruzione case

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']};"; 

risposta

2

Possibilmente riportare il campo di ordinamento nella SELECT e poi ordina per quel campo denominato: -

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']};"; 

Nota che potrebbe essere necessario eseguire il cast dei campi su un tipo di dati per eseguire questa operazione.

+0

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

+0

Qualcosa del genere potrebbe essere più flessibile, anche se in questo caso si sta utilizzando una funzione di aggregazione senza un gruppo. Solo usando il maggior valore possibile di id lo farebbe. Tuttavia ricorda che potresti dover eseguire il cast dell'ID su una stringa, e fare qualche giocherellando per poi avere le stringhe ordinate nello stesso ordine dei numeri (ad esempio, magari aggiungere gli zeri iniziali) – Kickstart