通过自定义条件订购值

时间:2018-09-25 10:39:52

标签: mysql sql select sql-order-by mysql-workbench

我有两个表A和B:

表-A-代表人员的基本信息

emp_id |      email       | name
----------------------------------------
 1     | abc@gmail.com    |   john
 2     | dbc@gmail.com    |   john1
 3     | cbc@gmail.com    |   john2
 4     | xbc@gmail.com    |   john3
 5     | xac@gmail.com    |   john4

表-B代表人员处理的位置

john正在处理Region和Zone john1正在处理Area和Territory等……

locationType的顺序如下:Region-> Zone-> Area-> Territory 区域的优先级更高,然后是区域,等等。

id | emp_id | locationType
--------------------
 1 | 1     |   Region
 2 | 2     |   Area
 3 | 3     |   Area
 4 | 4     |   Territory
 5 | 1     |   Zone
 6 | 2     |   Territory
 7 | 5     |   Zone
 8 | 5     |   Area

我想获取处理更高locationType的人员。 假设john正在处理Region和zone,所以我想显示Region为Region的优先级更高,而john1正在处理Territory和Area,所以我只想显示Area,因为Area的优先级更高

我想要的输出:

 id | emp_id |   name   |   locationType 
----------------------------------------
 1  | 1      |   john   |   Region
 5  | 5      |   john4  |   Zone
 3  | 3      |   john1  |   Area
 4  | 4      |   john2  |   Area
 4  | 4      |   john3  |   Territory

我得到的是

 id | emp_id |   name   |   locationType 
----------------------------------------
 1  | 1      |   john   |   Region
 1  | 1      |   john   |   Zone
 5  | 5      |   john4  |   Zone
 5  | 5      |   john4  |   Area
 2  | 2      |   john1  |   Area
 3  | 3      |   john2  |   Area
 4  | 4      |   john3  |   Territory
 4  | 4      |   john3  |   Territory

3 个答案:

答案 0 :(得分:2)

您可以使用field()将位置转换为数字。您想要的是基于此顺序的最小位置。

您可以使用相关子查询为每位员工获取此信息:

select b.*
from b
where field(b.locationType, 'Region', 'Zone', 'Area', 'Territory') =
       (select min(field(b2.locationType, 'Region', 'Zone', 'Area', 'Territory'))
        from b b2
        where b2.emp_id = b.emp_id
       );

a中添加额外的列只是加入表中的问题。

答案 1 :(得分:0)

在订单子句中使用case when

order by (case locationType when 'Region' then 1
                when 'Zone' then 2
                when 'Area' then 3
                   when 'Territory' then 4
                   else 5  end )

答案 2 :(得分:0)

要永久解决此问题,请执行以下步骤。它还将帮助您进行数据标准化。

1创建一个具有LocaitonType名称和ID的新表,并按所需顺序插入您的位置类型。

CREATE TABLE [dbo].[Table_C](
[LocationType_Id] [int] IDENTITY(1,1) NOT NULL,
[name] [nvarchar](50) NULL )    

 Insert Into [Table_C] (name) values('Region')
 Insert Into [Table_C] (name) values('Zone')
 Insert Into [Table_C] (name) values('Area')
 Insert Into [Table_C] (name) values('Territory')

2。更改表b LocationType 列将数据类型转换为int。

    Alter Table Table_B 
    Alter column locationType int not null
  1. 现在将ID从Table_c插入到T​​able_B Locationtype列。 并使用以下查询获得所需的输出。

从Table_A.emp_id = Table_B.emp_id上的Table_B内部联接Table_A中选择Table_B.id,Table_A.emp_id,Table_A.name,Table_C.name作为locationType Table_C.LocationType_Id = Table_B.locationType上的内部联接Table_C 按Table_C.LocationType_Id

排序