以不自然的顺序排列结果集

时间:2012-01-17 16:55:08

标签: mysql sql

我了解正常的ASCDESC ORDER BY条款。

但是,我有一种情况,其中table包含一列unitType,其中unitType可以是0,1或2.我需要对结果集进行排序,以便返回的行按特定顺序排列取决于unitType列的值。

这是我最接近的:

SELECT * FROM `units` WHERE `unitType`=0
union 
select * from units where unitType=2
union 
select * from units where unitType=1

这会列出我的unitType=0行,然后列出值为2的行,最后是1.有更好的方法吗?我需要更改此查询以按任何特定顺序获取行,例如2,0,1等。

5 个答案:

答案 0 :(得分:6)

SELECT *
    FROM units
    WHERE unitType IN (0,1,2)
    ORDER BY CASE WHEN unitType = 0 THEN 1
                  WHEN unitType = 2 THEN 2
                  WHEN unitType = 1 THEN 3
             END 

答案 1 :(得分:3)

您还可以使用 FIELD() 功能:

SELECT * 
FROM units 
ORDER BY FIELD(unitType, 0,2,1)

答案 2 :(得分:2)

select * from units
order by
  case when unitType = 0 then 1
       when unitType = 1 then 3
       else 2 end

答案 3 :(得分:2)

我将创建一个单独的SortOrder表(UnitType,Ordinal)并使用它来定义排序。然后,您可以使用UnitType连接到该表,并按顺序对结果进行排序。

答案 4 :(得分:1)

不要将此逻辑“隐藏”在查询的ORDER BY子句中,而是考虑创建一个表来映射unitType和排序顺序值(例如两列基表),在查询中加入此表并且在SELECT子句 ORDER BY子句中包含排序顺序属性(将排序顺序公开给调用应用程序)。