2012-02-07 4 views
3

Bonjour, j'essaie de commander des données de domaine en utilisant leur statut. Comme vous le savez peut-être, l'état du domaine DOM_EXP ou DOM_DAKT s'applique avant que le domaine ne frappe DOM_HELD donc je ne m'inquiète pas de savoir qu'un de ces statuts a un domaine avant qu'il ne devienne DOM_HELDCommande MySQL par champ

Comment puis-je commander ces données? L'utilisation de sélection fourni ci-dessous, je n'atteins que DOM_DAKT est behing DOM_EXP mais je veux que ce soit quelque part entre les deux, commandé par date_expiration

SELECT domain_id, status, exp_date 
FROM domains 
ORDER BY 
field (status, 'DOM_DEL', 'DOM_HELD', 'DOM_EXP', 'DOM_DAKT'), 
exp_date ASC; 

+-----------+----------+---------------------+ 
| domain_id | status | exp_date   | 
+-----------+----------+---------------------+ 
|   2 | DOM_DEL | 2012-02-02 10:47:33 | 
|   4 | DOM_HELD | 2012-02-02 10:47:38 | 
|   5 | DOM_HELD | 2012-02-02 10:47:40 | 
|   7 | DOM_HELD | 2012-02-02 10:47:44 | 
|   1 | DOM_EXP | 2012-02-02 10:47:27 | 
|   3 | DOM_EXP | 2012-02-02 10:47:35 | 
|   6 | DOM_EXP | 2012-02-02 10:47:42 | 
|  54 | DOM_DAKT | 2012-02-02 10:47:39 | 
+-----------+----------+---------------------+ 

le résultat doit être comme ce

+-----------+----------+---------------------+ 
| domain_id | status | exp_date   | 
+-----------+----------+---------------------+ 
|   2 | DOM_DEL | 2012-02-02 10:47:33 | 
|   4 | DOM_HELD | 2012-02-02 10:47:38 | 
|   5 | DOM_HELD | 2012-02-02 10:47:40 | 
|   7 | DOM_HELD | 2012-02-02 10:47:44 | 
|   1 | DOM_EXP | 2012-02-02 10:47:27 | 
|   3 | DOM_EXP | 2012-02-02 10:47:35 | 
|  54 | DOM_DAKT | 2012-02-02 10:47:39 | 
|   6 | DOM_EXP | 2012-02-02 10:47:42 | 
+-----------+----------+---------------------+ 
+0

est la dernière ligne du résultat attendu supposé être 'DOM_DAKT'? – Corubba

+0

@BloodyWorld: non sur DOM_EXP et DOM_DAKT ne doivent appliquer l'ordre par exp_date car ils sont égaux – nabizan

Répondre

2

ordre d'abord par " rang "de statut où DOM_EXP et DOM_DAKT sont considérés comme de rang égal. Puis commander par EXP_DATE au sein de chaque "rang" de l'état

SELECT domain_id, status, exp_date 
FROM domains 
ORDER BY CASE WHEN status = 'DOM_DEL' THEN 1 
       WHEN status = 'DOM_HELD' THEN 2 
       WHEN status = 'DOM_EXP' THEN 3 
       WHEN status = 'DOM_DAKT' THEN 3 -- EXP and DAKT are "of equal rank" 
END, 
EXP_DATE 

Regardez l'expression CASE comme une application status =>ordering rank

0

drop simplement DROP_EXP et DOM_DAKT de la déclaration.

SELECT domain_id, status, exp_date 
FROM domains 
ORDER BY 
field (status, 'DOM_DEL', 'DOM_HELD'), 
exp_date ASC; 

Cela suppose que DOM_EXP et DOM_DAKT sont les seuls autres statuts.

+0

Je ne peux pas le faire car il existe d'autres statuts, voir Lukas Eder answen – nabizan