2012-03-05 61 views
-1

我有一个SQL查询,我需要使用它来排序字段。通常情况下,一个查询会像这样进入休眠状态SQL - 按字段随机数字顺序排序

select * from model order by model.field1,model.field2 问题是第一个排序需要按照特定的顺序完成。

其中必须按照特定顺序过滤字段1中的订单。

因此,例如,不要按字母顺序列出汽车。我宁愿排序说 雷克萨斯,福特,丰田,马自达,梅赛德斯等有没有一个干净的方式来做到这一点?目前我得到的结果,然后必须把它放在具体的清单,并不是很干净。我没有修改数据库中的东西的选项

谢谢。

+1

BTW,你并不是在谈论随机订单。更多的订单。 – 2012-03-05 00:17:28

回答

1

您可以使用CASE语句创建自定义的ORDER BY。
CASE语句会检查您的条件,并将满足该条件的行分配给比分配给不满足条件的行更低的值。
它可能最容易理解给出的例子:

SELECT mycolumn 
    FROM model 
ORDER BY CASE WHEN model.field1 = 'Lexus' THEN 0 
       WHEN model.field1 = 'Ford'  THEN 1 
       WHEN model.field1 = 'Toyota' THEN 2 
       WHEN model.field1 = 'Mazda' THEN 3 
       WHEN model.field1 = 'Mercedes' THEN 4 END, model.field2; 
1
order by (case 
when field1 = 'Lexus' then 1 
when field1 = 'Ford' then 2 
when field1 = 'Toyota' then 3 
... 
else null end) 
0

您需要使用窗口功能和PARTITION BY子句,像这样:

SELECT ROW_NUMBER() OVER(PARTITION BY manufacturer ORDER BY field1) [RN], 
     manufacturer, 
     field1, 
     field2 

FROM model 

这会给一个行号为每个在此示例中,基于field1的排序,在partition by子句中进行了不同的分组。

编辑:

如果你的关系数据库管理系统不支持窗口的功能,可以通过制造商订购,然后第二个值 - 这将“组”的所有每个厂家排在一起:

SELECT manufacturer, field1 

FROM model 

ORDER BY manufacturer, field1 
+0

这可以在其他一些RDBMS中使用,但我不相信MySQL支持窗口功能。 – bernie 2012-03-05 00:18:35

+0

如果是这样的话,那就不要理我的答案。我没有使用mySQL,但有一个印象,那就是窗口函数在标准供应商的通用SQL实现中: http://en.wikipedia.org/wiki/SQL:2003 – 2012-03-05 00:20:31