MySQL按字段排序

3

你好,我正在尝试按照域名状态订购域名数据。正如你所知,域名状态DOM_EXP或DOM_DAKT适用于域名达到DOM_HELD之前,因此在域名变为DOM_HELD之前,我不关心这些状态中的哪一个。

我该如何订购这些数据?使用下面提供的选择器,我只能实现DOM_DAKT位于DOM_EXP之后,但我希望它在其中某个位置,按exp_date排序。

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 |
+-----------+----------+---------------------+

结果必须像这样

+-----------+----------+---------------------+
| 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 |
+-----------+----------+---------------------+

预期结果的最后一行是否应该是 DOM_DAKT - Corubba
@BloodyWorld:DOM_EXP和DOM_DAKT不应该同时应用,只需按exp_date排序即可,因为它们是相等的。 - nabizan
2个回答

2

首先按照状态的“rank”排序,其中将DOM_EXPDOM_DAKT视为相等的“rank”。然后在每个状态的“rank”内按照EXP_DATE排序。

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

CASE表达式看作是一个映射,其中status => ordering rank


0

只需从语句中删除DROP_EXPDOM_DAKT即可。

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

这是在假设DOM_EXPDOM_DAKT是唯一的其他状态。


我不能这样做,因为还有其他的状态,请参考Lukas Eder的回答。 - nabizan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接