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
,否则需要max
id
,则可以使用条件聚合:

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。