MySQL порядок по полю - PullRequest
       4

MySQL порядок по полю

3 голосов
/ 07 февраля 2012

Привет, я пытаюсь заказать данные домена, используя их статус. Как вы, возможно, знаете, статус домена DOM_EXP или DOM_DAKT применяется до того, как домен достигнет DOM_HELD, поэтому мне все равно, какой из этих статусов имеет домен до того, как он стал DOM_HELD

Как я могу заказать эти данные? Используя select, предоставленный ниже, я только добиваюсь того, что 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 |
+-----------+----------+---------------------+

Ответы [ 2 ]

2 голосов
/ 07 февраля 2012

Порядок сначала по «рангу» статуса, где DOM_EXP и DOM_DAKT считаются равными. Затем заказывайте по 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 голосов
/ 07 февраля 2012

Просто удалите DROP_EXP и DOM_DAKT из оператора.

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

Это предполагает, что DOM_EXP и DOM_DAKT являются единственными другими состояниями.

...