我有一个表员工,其字段为empid,status,name。它们是具有相同emp id的多个记录。要应用的条件如下:
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的新手。任何帮助将不胜感激。谢谢
答案 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
另一种更传统的方法使用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' ))