Mysql获取连接上的最新行/选择一个表(1:n)

时间:2018-05-18 07:03:26

标签: mysql sql join

我有桌子"用户" (主键是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" 

但它如何与多个/所有用户合作?

问候, 错误

2 个答案:

答案 0 :(得分:2)

您可以在用户

的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 

答案 1 :(得分:2)

你可能想要这些内容:

SELECT u.*, um.*
FROM user u
INNER JOIN user_meta um
    ON u.id = um.user_id
INNER JOIN
(
    SELECT user_id, MAX(valid_from) AS max_valid_from
    FROM user_meta
    GROUP BY user_id
) t
    ON um.user_id = t.user_id AND
       um.valid_from = t.max_valid_from;

这里解释不多,除了子查询别名t将为每个用户过滤掉除最新元数据记录之外的所有元数据记录。