我有一个表 users
:
id | name
1 | Mike
我有一个表 rights
,这给了我的用户一些权利,例如:
id | user | elevation | starts | ends
1 1 2 1382950736 1383555536
这里我将 Mike 提升到了 2 级,从 1382950736 开始到 1383555536 结束。在这个时间范围内,用户是 2 级。其他时间,用户是 1 级。
我有一个查询来了解用户的级别:
SELECT IF(`z`.`elevation` IS NULL, 1, `z`.`elevation`) as `elevation`, `users`.`id`
FROM `users`
LEFT JOIN (
SELECT `user`, `elevation`
FROM `rights`
WHERE (`starts` <= $time) AND (`ends` > $time)
GROUP BY `user`
) as `z` ON `z`.`user` = `users`.`id`
这一切都很棒并且工作完美。但是,当某个用户的海拔重叠时,我会遇到问题。
例如:为了举一个简单的例子,让我们想象一下,现在的时间是 10。
我们创建此条目:
id | user | elevation | starts | ends
1 1 2 1 15
2 1 3 5 20
在本例中,两个条目均满足 (`starts` <= $time) AND (`ends` > $time)
条件(当前时间为 10)。在这些情况下,我的 SELECT 查询的作用是为我的用户返回级别 2,尽管他的最新条目是级别 3。
如何修复查询以返回最新级别,而不是任何级别,以防更多级别重叠?
最佳答案
SELECT COALESCE(z.elevation,1) elevation
, u.id
FROM users u
LEFT
JOIN
( SELECT user
, elevation
FROM rights x
JOIN
( SELECT user,MAX(starts) max_starts FROM rights GROUP BY user ) y
ON y.user = x.user
AND y.max_starts = x.starts
WHERE '$time' BETWEEN starts AND ends
) z
ON z.user = u.id
明白了吗?
关于MySQL - 加入用户最新级别,不是任何级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19634661/