根据状态条件消除重复

时间:2012-06-18 17:16:49

标签: mysql

我有一个表员工,其字段为empid,status,name。它们是具有相同emp id的多个记录。要应用的条件如下:

  1. 获取每个员工ID的单个记录
  2. 如果存在失败状态,则删除记录,除非他们具有扣留或撤销状态或两者兼有。
  3. Table Struture:

    empid      name      status
    1          p1        fail
    2          p2        pass
    2          p2        fail
    3          p3        pass
    4          p4        pass
    4          p4        onhold
    5          p5        fail
    5          p5        withheld
    5          p5        withdrawn
    6          p6        fail
    6          p6        withheld
    6          p6        withdrawn
    6          p6        onhold
    7          p7        fail
    7          p7        withheld
    8          p8        fail
    8          p8        withdrawn
    9          p9        fail
    9          p9        withdrawn
    9          p9        onhold
    10         p10       pass
    10         p10       onhold
    10         p10       withdrawn
    11         p11       waiting
    11         p11       disburse
    11         p11       withdrawn
    12         p12       disburse
    12         p12       fail
    

    结果应如下所示:

    empid      name
    3          p3
    4          p4
    5          p5  
    6          p6
    7          p7
    8          p8
    9          p9
    10         p10
    11         p11
    

    我是MYSQL的新手。任何帮助将不胜感激。谢谢

4 个答案:

答案 0 :(得分:0)

select distinct empid, name from employee where status <> 'fail'

答案 1 :(得分:0)

SELECT DISTINCT empid, name FROM employee WHERE status != 'fail'

DISTINCT 关键字用于获取唯一值。因此,除了'fail'

之外,它将返回具有状态的唯一员工ID

答案 2 :(得分:0)

这是您正在询问的正确(我希望)查询。这是它的工作原理: 它使用整数值对每个状态进行评级。通过得到0,失败得到1,其他任何东西得到2.查询分组empid和aggret这3个可能值的最大值。 所以,如果max是0意味着一切都是通过,那么我们想要它。 如果max是1,则表示只有pass并且失败,所以我们不希望它们进入。 最后,如果max是2,则意味着至少有一些不是状态通过或失败的东西。如果我正确理解你的问题你也想要这些。

这是查询:

select empid, name
from
(
    select empid, name,
    max(if(status = 'pass', 0, if(status != 'fail', 2, 1))) as w
    from 
    emps
    group by empid
) t
where w != 1

(编辑上一个回答)

答案 3 :(得分:0)

执行此操作的一种方法是将值分配给-1,1和1以使其失败,撤消和保留。然后将它们相加并仅选择记录&gt; 1

SELECT empid, 
       name 
FROM   employee 
GROUP  BY empid, 
          name 
HAVING Sum(CASE status 
             WHEN 'fail' THEN -1 
             WHEN 'withdrawn' THEN 1 
             WHEN 'withheld' THEN 1 
             ELSE 0 
           end) > -1 

Demo

另一种更传统的方法使用IN和NOT IN子句

SELECT DISTINCT empid, 
                name 
FROM   employee 
WHERE  empid NOT IN (SELECT empid 
                     FROM   employee 
                     WHERE  status = 'fail') 
        OR empid IN (SELECT empid 
                     FROM   employee 
                     WHERE  status IN ( 'withheld', 'withdrawn' )) 

Demo