订购多个领域

时间:2013-05-09 10:09:48

标签: mysql sql database

想象一下这样一个简单的例子:designerdeveloperreviewer存储在表work中,如下所示:

+----+----------+-----------+----------+
| id | designer | developer | reviewer |    
+----+----------+-----------+----------+
| 1  | sudo_O   | fred      | bob      |
| 2  | fred     | bob       | sudo_O   |
| 3  | bob      | sudo_O    | fred     |
| 4  | sudo_O   | fred      | bob      |
| 5  | bob      | sudo_O    | fred     |
| 6  | fred     | bob       | sudo_O   |  
| 7  | fred     | bob       | john     |   
| 8  | john     | bob       | fred     | 
+----+----------+-----------+----------+

查询表格以查找我的所有工作:

select * from work where designer='sudo_O' or developer='sudo_O' or reveiwer ...

是否可以按工作类型设计,开发,审核来订购结果,如下所示:

1, sudo_O, fred, bob
4, sudo_O, fred, bob
3, bob, sudo_O, fred
5, bob, sudo_O, fred
2, fred, bob, sudo_O
6, fred, bob, sudo_O

这就是我首先展示的所有设计工作,然后是开发,然后是审查。

1 个答案:

答案 0 :(得分:3)

SELECT id, designer, developer, reviewer
FROM work 
WHERE designer = 'sudo_O' OR developer = 'sudo_O' OR reviewer = 'sudo_O'
ORDER BY 
    CASE 'sudo_O' 
        WHEN designer  THEN 1
        WHEN developer THEN 2
        WHEN reviewer  THEN 3
    END, id ;

或者像这样(在大表和3个索引上可能更有效,每列一个):

SELECT id, designer, developer, reviewer
FROM 
  ( SELECT id, designer, developer, reviewer, 1 AS ord
    FROM work 
    WHERE designer = 'sudo_O' 
  UNION ALL
    SELECT id, designer, developer, reviewer, 2
    FROM work 
    WHERE developer = 'sudo_O' 
  UNION ALL
    SELECT id, designer, developer, reviewer, 3
    FROM work 
    WHERE reviewer = 'sudo_O'
  ) AS t
ORDER BY ord, id ;