输出中的自定义行顺序

时间:2013-06-13 06:54:54

标签: mysql sql

我希望查询结果集中的行遵循我在IN子句中指定的特定值的顺序。

这是我的疑问:

SELECT rd.id,
       rd.room_no,
       rd.bed_one,
       rd.bed_two,
       rd.bed_count,
       ir.room_type_id,
       ir.prop_id 
FROM room_details rd 
   JOIN (inventory_rooms ir) 
WHERE ir.id=rd.inventory_type_id 
  AND ir.prop_id IN ('6966','9016','8900','15242');

这是结果集:

id   room_no     bed_one  bed_two  bed_count  room_type_id  prop_id  
---  ----------  -------  -------  ---------  ------------  -------
48   C- 202-01A  null     null     1          20            6966  
49   C- 202-02A  null     null     1          20            6966  
24   D-802 -A    null     null     1          20            9016  
25   D-802 -B    null     null     1          20            9016  
243  101         null     null     1          4             8900  
267  102-B       null     null     1          4             8900  
23   D-804 -C    C1       C2       2          21            9016  
39   D-805-A     A1       A2       2          21            9016   

我希望将相同的prop_id值粘在一起,并按照IN列表中的顺序进行操作。特别是,最后两行应与第3行和第4行一起使用。

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:2)

由于您似乎需要SomeColumn上相当随意的订单,您可以对订单进行硬编码,如下所示:

SELECT id, someColumn
    FROM  `Table` 
    WHERE someColumn IN ('2','4','3') 
ORDER BY 
    CASE SomeColumn 
        WHEN '2' THEN 1 -- '2's come first
        WHEN '4' THEN 2 -- then '4's
        WHEN '3' THEN 3 -- then '3's
        ELSE 4 -- then everything else, etc
    END;

SqlFiddle here

更新您的新数据/问题

(注意 - MSSQL - MySql标签仅在稍后添加。)

您可以使用temp table @ pdleorme的创意来创建'订单'表。由于您需要动态,因此请按照您希望结果排序的顺序插入过滤器值,如下所示。请注意,不再需要where子句,因为对临时表的连接将隐式过滤:

CREATE TABLE #tmpOrder
(
    ID INT IDENTITY(1,1), -- used to retain the order
    prop_id NVARCHAR(10)
);

-- Insert the filter columns values here, in the order in which you want to sort
INSERT INTO #tmpOrder(prop_id) VALUES ('6966'), ('9016'), ('8900'), ('15242');

SELECT rd.id,rd.room_no,rd.bed_one,rd.bed_two, -- ...
FROM room_details rd 
    JOIN inventory_rooms ir ON ir.id=rd.inventory_type_id 
    -- Where is No LONGER NEED WHERE ir.prop_id IN ('6966','9016', ...
    JOIN #tmpOrder t on t.prop_id = ir.prop_id 
ORDER BY t.ID ASC;

Updated SqlFiddle

答案 1 :(得分:1)

您可以使用订单表:

order_table :
id | order
----------
 1 | 1
 2 | 3
 3 | 2
...

并通过

进行加入/订购
select id 
  from data_table,
       order_table
 where data_table.id = order_table.id
 order by order_table.order

答案 2 :(得分:0)

您尚未提供查询。尽管如此,假设您不能使用您提到的Order By子句,有两种方法可以实现此目的:

第一个选项

在名为" OrderByCol"

的表中插入另一列

现在在您的数据中,例如:

Sr   OrderByCol   Col3 
2    1            xyz
2    1            abc
3    3            123
3    3            456
4    2            qwerty
4    2            123456

然后使用以下查询:

Select * from #table order by OrderByCol

第二个选项

如果无法插入Column,则可以使用UNION All运算符

Select * from #table1 where SrNo=2
UNION all
Select * from #table1 where SrNo=4
UNION all
Select * from #table1 where SrNo=3

UNION all子句将按所需顺序对结果进行分组。

第一种选择是任何一天更好。