Order By是一个升序和降序的情况

时间:2011-12-08 07:09:58

标签: mysql

我正在使用MySQL数据库。我必须创建一个接受整数类型参数的存储过程。根据整数的值,我必须“排序”一个不同的值,如此..

**if(type == 1) than
order by Date Desc,
Quantity asc,
Amount asc

else if(type == 2)than
order by Date ASc,
Quantity asc,
Amount asc


else if(type == 3)than
order by 
Quantity asc
Date desc,
Amount asc

然而,当我尝试这个时,我无法做到这一点,它也会给出错误。

4 个答案:

答案 0 :(得分:2)

如果查看SELECT的语法,您会发现ORDER BY子句不能出现在CASE语句中。

如果列是数字类型,则可以编写一个表达式,1表示升序,-1表示降序,并将表达式乘以列以进行排序,但这会影响性能,因为MySQL将无法使用任何索引进行排序。

SELECT ...
  ORDER BY IF(?='d', -1, 1) * value

但一般情况下,您必须使用不同的语句来获得不同的排序。

答案 1 :(得分:1)

如果Date是正确的datedatetime,您可以执行以下操作:

ORDER BY
    CASE type WHEN 3 THEN -1 * Date ELSE Date END asc,
    Quantity asc, Amount asc

http://dev.mysql.com/doc/refman/5.0/en/case-statement.html

这是有效的,因为datetime和其他MySQL日期和时间类型在内部存储为整数:

http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html

答案 2 :(得分:1)

我终于得到了解决方案......

SELECT distinct


order_detail.*, -(1)*CAST(order_detail.Date as unsigned) as lOrderDate,

from order_detail

order by

CASE
WHEN type  = 1 THEN lOrderDate
WHEN type = 2 THEN order_detail.Date
WHEN type = 3 THEN order_detail.Quantity

END,

CASE
WHEN type = 1 THEN order_detail.Quantity
WHEN type = 2 THEN order_detail.Quantity
WHEN type = 3 THEN lOrderDate

END,

CASE
WHEN type = 1 THEN order_detail.Amount
WHEN type = 2 THEN order_detail.Amount
WHEN type = 3 THEN order_detail.Amount

END;

答案 3 :(得分:0)

两种方式:

  1. 构建您的查询 - 就像一个字符串,然后使用prepared statements来执行它。
  2. 使用IF-ELSEIF-END IF语句执行三个不同的SELECT查询。