获取具有null的行或列的Max值

时间:2017-04-12 14:04:37

标签: mysql sql

我需要从数据库中获取所有用户。当用户被删除时,他们的列deletionDate将填充日期。重新创建已删除的用户时,会创建一个新行。

我需要检索所有最新的"版本"每个用户的意思,这意味着每封电子邮件都有一行。如果存在deletionDate,那么我希望将其置于null(如果不存在,那么如果不存在空行,则为deletionDate

这是Fetch the row which has the Max value for a column

之间的混合

而且:MySQL return max value or null if one column has no value

伪表:

   ID    EMAIL   DELETE_DATE     

    1    mail1   2016-09-08 09:56:21
    2    mail1   2016-19-08 09:56:22
    3    mail1                         < SELECTED
    4    mail2   2017-19-08 09:56:22
    5    mail2   2018-19-08 09:56:22   < SELECTED
    6    mail3   2018-15-08 09:56:22   < SELECTED
    7    mail4                         < SELECTED

SELECTED表示我想在查询中获得的行列表。

我的DBMS是MySQL,但如果有办法处理JPA,它会更好,更符合标准。 我也不想挑选田野;我想要真正的行。

3 个答案:

答案 0 :(得分:1)

如果您只有一个用户,则可以执行以下操作:

select t.*
from t
where t.userid = $userid  -- if this is called from app code, use a parameter
order by (deletionDate is null) desc,
         deletionDate desc;

答案 1 :(得分:1)

假设每封电子邮件只有一行,其中delete_date为空,您可以使用union all

select email,delete_date
from t
where delete_date is null
union all
select email,max(delete_date)
from t t1
where not exists (select 1 from t t2 where t1.email=t2.email and t2.delete_date is null)
group by email

答案 2 :(得分:0)

以下是我最终要做的事情,因为我想避免使用Union,因为它在JPA中不可用,我想获得完整的行。

 select * from USER
 where (DELETE_DATE is null
 OR ID in (select ID from USER where (EMAIL, DELETE_DATE) in 
 (select EMAIL, max(DELETE_DATE) from USER where EMAIL not in 
 (select EMAIL from USER where DELETE_DATE is null) group by EMAIL )));

如果有更简单或更好的方法,我很感兴趣。