2012-06-21 3 views
1

J'ai lu quelques articles ayant le même problème. J'ai essayé d'adapter leurs réponses mais pas réussi. Je souhaite trier les colonnes par statut plutôt que par statut, puis trier les colonnes. mai la requête ci-dessous effacera mon pointConditionnel Ordre par clause dans mysql

SELECT a.*,STR_TO_DATE(d_date, "%m/%d/%Y")>CURDATE() as status 
FROM table AS a ORDER BY status DESC, 
IF(status=0, 
'DATEDIFF(STR_TO_DATE(a.d_date, "%m/%d/%Y"),CURDATE()) DESC', 
'DATEDIFF(STR_TO_DATE(a.d_date, "%m/%d/%Y"),CURDATE()) ASC') 

MISE À JOUR: Après ci-dessous requête

SELECT a . * , STR_TO_DATE(d_date, "%m/%d/%Y") > CURDATE() AS 
STATUS 
FROM `table` AS a 
ORDER BY STATUS DESC , IF( 
STATUS =0, DATEDIFF(STR_TO_DATE(a.d_date, "%m/%d/%Y") , CURDATE()) DESC , DATEDIFF(STR_TO_DATE(a.d_date, "%m/%d/%Y") , CURDATE()) ASC) 
LIMIT 0 , 30 

J'ai l'erreur ci-dessous

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DESC, DATEDIFF(STR_TO_DATE(a.d_date, "%m/%d/%Y"),CURDATE()) ASC) LIMIT ' at line 4 

Si mon nom de la table est table que Pour ce recored

d_date 
06/28/2012 
06/23/2012 
06/20/2012 
06/19/2012 

si la date actuelle est 06/21/2012

la sortie devrait être

d_date    status 
06/23/2012    1 
06/28/2012    1 
06/20/2012    0 
06/19/2012    0 

ces informations mai est suffisant. S'il vous plaît laissez-moi savoir si ce n'est pas encore clair.

Merci

+1

Ne pas utiliser des guillemets dans votre 'IF' .. sinon, il sera considéré comme une chaîne. – arnep

+0

est 'IF' pris en charge dans mysql ou non.Il douteux –

+0

@Somebodyisintrouble: son autorisé. Voir [ici] (http://dev.mysql.com/doc/refman/5.5/en/if-statement.html) –

Répondre

3

Essayez celui -

SELECT 
    a.*, 
    STR_TO_DATE(d_date, '%m/%d/%Y') > CURDATE() AS status 
FROM 
    table AS a 
ORDER BY 
    status DESC, 
    IF(status = 0, 
    DATEDIFF(STR_TO_DATE(a.d_date, '%m/%d/%Y'),CURDATE()) * -1, 
    DATEDIFF(STR_TO_DATE(a.d_date, '%m/%d/%Y'),CURDATE()) 
) 
+0

Merci Devart votre réponse a fait le travail. – Irfan

+1

génial .. Je ne peux pas le croire ... –

+0

Oui, c'est une petite astuce qui permet d'éviter d'utiliser ASC ou DESC dans la clause ORDER BY. – Devart

0

Je suppose que ce (nouveau) solution fera l'affaire:

SELECT a.*, STR_TO_DATE(d_date, "%m/%d/%Y")>CURDATE() as status 
FROM `table` AS a ORDER BY status DESC, 
IF(status=0, 
CONCAT_WS(' ', DATEDIFF(STR_TO_DATE(a.d_date, "%m/%d/%Y"),CURDATE()), 'DESC'), 
CONCAT_WS(' ', DATEDIFF(STR_TO_DATE(a.d_date, "%m/%d/%Y"),CURDATE()), 'ASC'))