2009-07-05 3 views
3

У меня есть "задачи" стол с 3-мя полями:Условная сортировка в MySQL?

  1. Дата
  2. приоритет (0,1,2)
  3. сделано (0,1)

То, что я пытаюсь достигнуть со всей таблицей, отсортированной по установленному флагу, задачи, которые не выполняются, должны сортироваться по приоритету, а задачи, которые выполняются, должны сортироваться по дате:

  1. Select * от заказа задач по сделано по возрастанию
  2. Если все сделано = 0 дополнительно порядка по приоритету по алфавиту
  3. Если все сделано = 1 дополнительно упорядочить по дате по алфавиту

Можно ли это сделать в MySQL без союзов?

Спасибо.

ответ

12

Вы можете попробовать ORDER BY (done asc, aux desc) где Окс вычисленную с CASE с получением либо приоритета или даты на основе значения done (вы, возможно, придется бросить их к тому же типу, чтобы поместиться в одном выражении, например, бросить дату подходящий целочисленный день).

Например:

SELECT * FROM tab 
ORDER BY done desc, 
     case done 
      when 0 then prio 
      else to_days(thedate) 
     end desc; 
+0

Спасибо, что работает (даже без TO_DAYS) – serg

+0

Ah , Я думаю, что MySQL автоматически кастует, тогда - хорошо, всегда очень сложно догадаться, где MySQL будет автоматически отбрасываться, а где он не будет! -) –

7

Взятые от Alex Мартелли просто укоротить немного с IF() и закрепил ASC/DESC заказа

SELECT * FROM tab 
ORDER BY done ASC, IF(done, to_days(thedate), prio) DESC; 
Смежные вопросы