MySQL 返回用户排名最高的事件

2024-04-23

我目前使用以下查询来获取每个用户的详细信息。

SELECT u.*, sums.total_votes, sums.no_of_events
FROM user u
LEFT JOIN
(
  SELECT
    us.user_uid,
    count(ev.event_vote_id) AS total_votes 
    count(distinct ue.event_uid) AS no_of_events
  FROM user_event ue
  LEFT JOIN event_vote ev
  ON ev.event_uid = ue.event_uid
  GROUP BY ue.user_uid
) sums ON sums.user_uid = u.user_uid

然而,我还希望返回他们得票最高的活动的排名(在所有活动中 - 不仅仅是他们自己的活动)。

USER

|  USER_UID  |  FIRSTNAME  |  LASTNAME  | 
       1         bob          smith
       2         rob          smithies 
       3         john         clark

EVENT

| GUID | NAME |  
  101   event1
  102   event2
  103   event3

用户事件

| USER_EVENT_ID | USER_UID | EVENT_UID | 
       1001           1         101
       1002           2         102
       1003           1         103

事件投票

| EVENT_VOTE_ID | USER_UID | EVENT_UID | 
       2001            2       101       
       2002            3       101
       2003            2       103

预期结果

user_uid: 1
firstname: bob
lastname: smith
votes: 3        // 2 for 101, 1 for 103.
no_of_events: 2
bestRank: 1 (1st)    // ranked 1st and 2nd but 1st is higher.

user_uid: 2
firstname: rob
lastname: smithies
votes: 0      
no_of_events: 1
bestRank: 3 (3rd)

该查询由 3 部分组成

  1. 用于计算每个用户的总事件的原始查询
  2. 对获得最多票数的所有活动进行排名。
  3. 过滤哪些事件具有最佳排名

在演示中,您还可以看到三个查询,以便您可以调试部分结果。

当前输出也是部分结果,为了获得您想要的结果,您需要添加

WHERE R.event_uid IS NULL

SQL DEMO http://sqlfiddle.com/#!9/0c781f/31

最终版本 http://sqlfiddle.com/#!9/0c781f/33

SELECT *
FROM (  SELECT u.*, sums.total_votes, sums.no_of_events
        FROM user u
        JOIN ( SELECT ue.user_uid,
                      count(ev.event_vote_id) AS total_votes, 
                      count(distinct ue.event_uid) AS no_of_events
               FROM user_event ue
               LEFT JOIN event_vote ev
                 ON ev.event_uid = ue.event_uid
               GROUP BY ue.user_uid
             ) as sums
          ON u.user_uid  = sums.user_uid 
     ) as U
JOIN (  SELECT T.*,
               @rank := @rank + 1 as rn,
               @dense := if (@votes = votes,
                             @dense,
                             if(@votes := votes, @rank, @rank)
                            ) as dense
        FROM (
              SELECT 
                     e.guid as event_uid,
                     ue.user_uid, 
                     count(ev.event_uid) AS votes             
              FROM event e
              JOIN user_event ue
                ON e.guid = ue.event_uid
              LEFT JOIN event_vote ev
                ON ev.event_uid = ue.event_uid      
              GROUP BY e.GUID, ue.user_uid
              ORDER BY count(ue.event_uid) DESC
             ) as T
        CROSS JOIN (SELECT @rank := 0, @dense := 0, @votes := 0 ) as vars
        ORDER BY votes desc, event_uid
)  as Q
ON U.user_uid = Q.user_uid
LEFT JOIN (  SELECT T.*,
               @rank2 := @rank2 + 1 as rn,
               @dense2 := if (@votes2 = votes,
                             @dense2,
                             if(@votes2 := votes, @rank2, @rank2)
                            ) as dense
        FROM (
              SELECT 
                     e.guid as event_uid,
                     ue.user_uid, 
                     count(ev.event_uid) AS votes             
              FROM event e
              JOIN user_event ue
                ON e.guid = ue.event_uid
              LEFT JOIN event_vote ev
                ON ev.event_uid = ue.event_uid      
              GROUP BY e.GUID, ue.user_uid
              ORDER BY count(ue.event_uid) DESC
             ) as T
        CROSS JOIN (SELECT @rank2 := 0, @dense2 := 0, @votes2 := 0 ) as vars
        ORDER BY votes desc, event_uid
)  as R
ON  Q.user_uid = R.user_uid
AND Q.rn > R.rn
-- WHERE  R.event_uid IS NULL

OUTPUT

| USER_UID | FIRSTNAME | LASTNAME | total_votes | no_of_events | event_uid | user_uid | votes | rn | dense | event_uid | user_uid |  votes |     rn |  dense |
|----------|-----------|----------|-------------|--------------|-----------|----------|-------|----|-------|-----------|----------|--------|--------|--------|
|        1 |       bob |    smith |           3 |            2 |       101 |        1 |     2 |  1 |     1 |    (null) |   (null) | (null) | (null) | (null) |
|        1 |       bob |    smith |           3 |            2 |       103 |        1 |     1 |  3 |     2 |       101 |        1 |      2 |      1 |      1 |
|        2 |       rob | smithies |           1 |            3 |       102 |        2 |     1 |  2 |     2 |    (null) |   (null) | (null) | (null) | (null) |
|        2 |       rob | smithies |           1 |            3 |       104 |        2 |     0 |  4 |     4 |       102 |        2 |      1 |      2 |      2 |
|        2 |       rob | smithies |           1 |            3 |       105 |        2 |     0 |  5 |     4 |       102 |        2 |      1 |      2 |      2 |
|        2 |       rob | smithies |           1 |            3 |       105 |        2 |     0 |  5 |     4 |       104 |        2 |      0 |      4 |      4 |
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL 返回用户排名最高的事件 的相关文章

  • 无法绑定多部分标识符

    我在 SO 上看到过类似的错误 但我找不到解决我的问题的方法 我有一个 SQL 查询 例如 SELECT DISTINCT a maxa b mahuyen a tenxa b tenhuyen ISNULL dkcd tong 0 AS
  • Python Peeweeexecute_sql() 示例

    我使用 Peewee 模块作为我的项目的 ORM 我看了整个文档 没有明确的 有关如何处理 db execute sql 结果的示例 我跟踪代码 只能发现db execute sql 返回游标 有谁知道如何处理光标 例如迭代它并获取 返回复
  • 如何根据某些条件跳过 MSSQL 游标中的一行(迭代)?

    如何根据某些条件在 MSSQL 游标中跳过一行 迭代 我有一个可迁移数千条记录的 DTS 并且根据某些条件 某些记录不需要迁移 因为它们是重复的并且想要跳过这些记录 知道如何在 MSSQL Cursor 中完成此操作吗 我想最简单的方法是在
  • 查询 ssisdb 以查找包的名称

    我正在查询 ssis 目录以找出目录中所有包的名称 Folder1项目中只有6个包 但查询却给出了9条记录 1 SELECT P NAME FROM SSISDB internal projects PRJ INNER JOIN SSISD
  • 数据库表可以没有主键吗?

    谁能告诉我关系数据库 例如MySQL SQL SERVER 中的表是否可以没有主键 例如 我可以有桌子day temperature 我注册的地方temperature and time 我不明白为什么要为这样的表设置主键 从技术上讲 您可
  • 一种父子关系级联软删除的方法

    我有一个简单的架构 其中使用软删除 这就是它的设计方式并且无法更改 有两个表参与该架构 Company id is deleted and Employee id company id is deleted where company id
  • 如何使用过程填充数据库

    我有大约 15 个不同的表 其中填充了不同的数据和不同的实体关系 我需要创建一个脚本 用这些表的内容填充我的数据库 脚本完成后 我使用 sqlplus 在 cmd 中运行它 然后使用 START文件路径 我有两个不同的 sql 文件 一个名
  • 根据另一个表中的值查找总计数

    在Mysql中 我的表中有具有重复值的城市 表城市 Name New York USA New York USA Chicago USA Chicago USA Chicago USA Paris France Nice France Mi
  • INNER JOIN 与 INNER JOIN (SELECT . FROM)

    同一查询的这两个版本之间的性能有什么区别吗 Version 1 SELECT p Name s OrderQty FROM Product p INNER JOIN SalesOrderDetail s on p ProductID s P
  • PostgreSQL 列“foo”不存在

    我有一个表 其中有 20 个整数列和 1 个名为 foo 的文本列 如果我运行查询 SELECT from table name where foo is NULL 我收到错误 ERROR column foo does not exist
  • SQL 获取当月前 3 个月的第一天

    我正在尝试选择当前日期前 3 个月的第一天 例如 如果当前日期是 2015 11 08 我的结果是 2015 08 01 我希望采用 yyyy mm dd 格式 我一开始就尝试过这个 但没有运气 SELECT DATEADD dd DAY
  • MySQL 查询 - 使用 ORDER BY rand( ) 强制区分大小写

    是否可以强制查询区分大小写 我的听起来是这样的 SELECT g path FROM glyphs WHERE g glyph g glyph ORDER BY rand 如果 g glyph r 结果可以是 R 或 r 这不是我所期望的
  • 将数组内爆为来自 mysql 查询的逗号分隔字符串

    在过去的 1 1 2 天里 我一直在尝试将 16 行 id 存储到一个字符串中 并用逗号分隔每个 id 我得到的数组来自 MySQL 我得到的错误是 implode 函数 传递了无效参数 str array string while row
  • 如何在 mysql 正则表达式中匹配大写 ÅäÖ

    当我在 MySQL 中进行 REGEXP 比较时 我得到了瑞典字符大写版本的一些奇怪结果 我正在使用 utf8 swedish ci 排序规则 我想查找大写单词 SELECT ster REGEXP BINARY A Z a z 应该返回
  • 优化 SELECT 和 WHERE 子句中的存储函数调用

    我有一个具有以下结构的 SQL 查询 SELECT storedfunc param table field as f FROM table WHERE storedfunc param table field lt value ORDER
  • 如何在应用程序级别管理只读数据库连接

    我们使用的是Java Spring Ibatis MySql 有没有办法利用这些技术在应用程序级别管理只读连接 我希望在只读 MySql 用户的基础上添加额外的保护层 如果 BasicDataSource 或 SqlMapClientTem
  • 实体框架..自引用表..获取深度=x的记录?

    我成功地在实体框架中使用自引用表 但我不知道如何获得所需深度的记录 这应该是什么逻辑 Model public class FamilyLabel public FamilyLabel this Children new Collectio
  • 我忘记了分号“;”在 MySQL 终端查询中。我该如何退出?

    有时我忘记用分号 结束 SQL 查询 在我的 Mac 终端中 发生这种情况时 终端会设置一个 gt 一开始我无法退出此命令或运行任何其他 SQL 命令 我该如何退出 你不知道mysql终端有5种不同的报价模式 我建议你回顾一下它们 http
  • MySQL 周数和新年

    我现在正在开发的网站有一个仪表板 显示各个用户在前一周输入的数据 我使用简单的 WHERE 子句选择此数据 SELECT FROM table WHERE WEEK date 1 WEEK CURDATE 1 1 然而 新年即将到来 当用户
  • 将文件保存为 MYSQL 数据库中的 blob 或文件路径

    我知道这些问题是常见问题之一 但我需要您针对具体案例提供帮助 我正在开发一个应用程序 其中一些用户可以添加订单 一些用户可以执行这些订单 这些订单非常具体 因此只有有限数量的用户可以添加它们 然后 为每个订单生成三个文档 每个文档的大小不超

随机推荐