我有一张桌子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 级。
如何修复我的查询以返回最新级别,而不是任何级别,以防更多级别重叠?