我有桌子"用户" (主键是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"
但它如何与多个/所有用户合作?
问候, 错误
答案 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
将为每个用户过滤掉除最新元数据记录之外的所有元数据记录。