MySQL - 加入用户最新级别,不是任何级别?

标签 mysql

我有一个表 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/

相关文章:

mysql - 无缝地同时提供 WP-Members 和 Facebook 登录选项

javascript - 从 JavaScript 调用 PHP 文件是否安全?

mysql - 如何按时间对事件表进行排序(具有不同的时区)?

MySQL:如何按小时对数据进行分组并获取最新的一小时

mysql - 面向多个用户的 Django 数据库架构设计

php - 如何为make循环编写左连接

php - 插入时MySQL语法错误

php - 如何使用php变量在javascript中循环

php - 如何使用ajax和codeigniter进行条件搜索

php - 登录表单小错误