2014-10-28 4 views
2

У меня есть таблица данных, как этотMYSQL на случай, когда

---------------------------------------------------------- 
| userID |  dateTime  | val1 | val2 | 
---------------------------------------------------------- 
| abc  | 2014-10-20 00:00:00 | 21.5 | 18.5 | 
| ijk  | 2014-10-21 00:00:00 | 22.5 | 17.5 | 
| pqr  | 2014-10-22 00:00:00 | 23.5 | 16.5 | 
| xyz  | 2014-10-23 00:00:00 | 24.5 | 14.5 | 
---------------------------------------------------------- 

Я хочу, чтобы отсортировать таблицу по dateTime в desc order по val1 в asc order и val2 в asc order, но если ID спичек пользователя Я хочу эту строку сверху всегда не зависит от другого поля.

Для этого у меня есть запрос, как этот

Select * 
from mytable 
order by case 
      when userID = 'abc' then 1 
      else 'ordeyByField' end 'order';  
WHERE orderByField = dateTime or val1 or val2 
For dateTime, order = desc 
     and 
    for val1 or val2, order = asc 

Когда я отсортировать его с знач1 или знач2 это нормально (потому что порядок по возрастанию), но когда я сортировать его с DateTime он показывает совпадающую USERID строку в последнем (потому что порядок desc). Я хочу, чтобы совпадающая строка userID была сверху.

Надеюсь, я объяснил свое требование. Пожалуйста, дайте мне знать, если вам нужно больше объяснений.

Заранее спасибо

ответ

3

Вы близки, и это легче, чем вы думаете, что это :-)

Select * 
from mytable 
order by case when userID = 'abc' then 0 else 1 end, dateTime desc, val1, val2; 
+0

идеальный .. Вот что я хотел ... Большое спасибо :) –

+0

На самом деле это функция FIELD()! – Strawberry

+1

@Strawberry: вы можете использовать 'FIELD (userID, 'abc') desc' здесь, но пока мы имеем дело только с одним значением, я бы рассматривал это как альтернативу, не более того. Однако, с большим количеством значений для ранжирования, FIELD определенно будет предпочтительным для конструкций case. –

Смежные вопросы