MySQL上的唯一联接条件
我有一个包含员工的表,在该表中我有以下数据:MySQL上的唯一联接条件,mysql,sql,Mysql,Sql,我有一个包含员工的表,在该表中我有以下数据: id username employee_status 33189 SLEE 3 36351 SLEE 0 29096595 SLEE 0 19197668 AARM 0 20738021 AARM 0 29097305 AARM 0 员工状态3表示活动,0表示非活动。因此,这些数据意味着用户SLEE已经被转
id username employee_status
33189 SLEE 3
36351 SLEE 0
29096595 SLEE 0
19197668 AARM 0
20738021 AARM 0
29097305 AARM 0
员工状态3表示活动,0表示非活动。因此,这些数据意味着用户SLEE已经被转移了好几次,仍然在公司工作,而用户AARM已经被转移了好几次,并离开了公司
我需要的是在这个表上进行不同的连接。我可以这样写一个查询:
SELECT username
, MAX(id)
FROM employees
GROUP BY username;
但这里的问题是拥有最大id并不总是意味着活动用户(如果有)总是拥有最大id,正如您在用户SLEE中看到的那样
我需要编写一个条件联接,如果有一个用户的雇员状态为3 return,否则将返回最大id。类似于此查询:
SELECT userid
, IF(employeestatus = 3 THEN id ELSE MAX(id) END)
FROM employees
GROUP BY userid;
但是这个查询不起作用。预期结果是:
id username employee_status
33189 SLEE 3
29097305 AARM 0
您可以对相关子查询使用条件排序:
select e.*
from de_ie_cm.employees e
where e.id = (select e1.id
from de_ie_cm.employees e1
where e1.userid = e.userid
order by (case when employeestatus = 3 then 0 else 1 end), id desc
limit 1
);
如果您使用的是MySQL 8.0+版,那么这段代码将适用于您
SELECT ID,username,Employee_Status FROM
(
SELECT *,ROW_NUMBER() OVER (PARTITION BY username ORDER BY Final_ID DESC) Rw_ID FROM
(
SELECT ID,username,employee_Status,CASE WHEN Employee_Status = 3 THEN 2 ELSE 0 END + CASE WHEN R_ID = 1 THEN 1 ELSE 0 END AS Final_ID
FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY username ORDER BY CAST(Id AS INT) DESC) AS R_ID ,*
FROM employees
)A
)A
) B WHERE Rw_ID = 1
如果需要状态为
3
的id
,否则需要maxid
,则可以使用条件聚合:
SELECT userid, MAX(employeestatus) as employee_status,
COALESCE(MAX(CASE WHEN employeestatus = 3 THEN id END),
MAX(id)
)
FROM employees
GROUP BY userid;
我想这应该对你有用
SELECT (CASE
WHEN max(status) = 0 THEN max(id)
WHEN max(status) = 3 THEN
(SELECT id
FROM A a2
WHERE status = 3
AND a1.name = a2.name)
END) AS aggregate_id,
name
FROM A a1
GROUP BY name
还要指定预期的结果。它工作得很好,但老实说,我不太喜欢再次加入一个大表(性能方面)。我将把计算移到代码端。@osumatu。使用最新的
MySQL
版本,您会变得更轻松。那么,您使用的是什么版本。您可以在更新的版本中使用窗口功能。我们的版本是5.7.23。@osumatu是为您设计的,在您上面的描述中,我认为您希望按名称分组,而不是按ID分组。谢谢您的回复,但我们的版本是5.7.23。