首页 > 解决方案 > Mysql获取加入/选择表的最新行(1:n)

问题描述

我有表“user”(主键是 id)和表“user_meta”(主键是 user_id 和 valid_from)。用户表包含基本用户数据,例如用户名、密码等。user_meta 包含可能更改的数据,例如姓氏、性别(是的,它的 2018 年:D)等。所以我有历史数据在哪一天有效。

我的问题是我尝试选择所有具有当前有效数据的用户,但我经常失败......

我怎样才能选择正确的数据?

对于一个用户,我可以简单地使用

"select * from user_meta 
  JOIN user on user_meta.user_id = user.id 
  ORDER BY valid_from DESC LIMIT 1" 

但它如何与多个/所有用户一起工作?

问候,假

标签: mysqlsqljoin

解决方案


您可以按用户对 max_valid 组的子选择使用连接

select * from user_meta
inner join (
    select user.id, max(user_meta.valid_from) max_valid
    from user_meta 
    JOIN user on user_meta.user_id = user.id 
    group by user.id
) t on t.id= user_meta.user_id and t.max_valid = user_meta.valid_from 

或更简单

select * from user_meta
inner join (
    select user_meta.user_id, max(user_meta.valid_from) max_valid
    from user_meta 
    group by user_meta.user_id
) t on t.user_id= user_meta.user_id and t.max_valid = user_meta.valid_from 

推荐阅读