我需要从数据库中获取所有用户。当用户被删除时,他们的列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,它会更好,更符合标准。 我也不想挑选田野;我想要真正的行。
答案 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 )));
如果有更简单或更好的方法,我很感兴趣。