【问题标题】:sql query for fetching leaderboard from two tables用于从两个表中获取排行榜的 sql 查询
【发布时间】:2021-07-06 22:08:04
【问题描述】:

我有两个 MySql 表用户和标记

用户表:

+-----------+--------------+------+-----+------ ---+----------------+
|领域 |类型 |空 |钥匙 |默认 |额外 |
+-----------+-------------+------+-----+--------- +----------------+
|编号 |整数 |否 |优先级 |空 |自动增量 |
|名字 | varchar(255) |是 | |空 | |
|姓氏 | varchar(255) |是 | |空 | |
|电子邮件 | varchar(55) |是 | |空 | |
+-----------+-------------+------+-----+--------- +----------------+

分数表

+--------------+--------------+------+-----+--- ------+----------------+
|领域 |类型 |空 |钥匙 |默认 |额外 |
+--------------+--------------+------+------+------ ---+----------------+
|编号 |整数 |否 |优先级 |空 |自动增量 |
|用户 ID |整数 |否 | |空 | |
|主题ID | varchar(255) |是 | |空 | |
|分数 |整数 |是 | |空 | |
|主题名 | varchar(225) |是 | |空 | |
+--------------+--------------+------+------+------ ---+----------------+

我想按降序获取得分最高的前 10 位用户的详细信息(用户 ID、名字和姓氏)。 用户的分数定义为用户在不同科目中的所有分数的总和。

我真的很困惑这里要使用哪个连接,我是 MySql 的新手,这个查询对我来说有点挑战性,希望你理解这个问题。 如果您有任何建议,请告诉我,谢谢

【问题讨论】:

  • MySQL 或 SQL Server - 选择一个。
  • 使用 MySQL @SMor

标签: mysql


【解决方案1】:

您可以通过id=user_id 将两个表连接在一起,然后将结果按id 分组,按id 的总分排序,然后取前10 个结果。

如果即使user 根本没有任何标记,您也想要一个结果,请将JOIN 更改为LEFT JOIN,即使第二个表没有结果,这仍然会为您提供第一个表的结果。

SELECT u.id, u.firstName, u.lastName, SUM(m.score) AS TotalScore
FROM [User] AS u
JOIN Marks AS m ON m.user_id = u.id
GROUP BY u.id, u.firstName, u.lastName
ORDER BY SUM(m.score) DESC
LIMIT 10;

【讨论】:

    【解决方案2】:

    您应该将来自表 User 的 id 上的表 Marks 与来自表 Marks 的 user_id 进行内部连接:

    SELECT user_id, firstName, lastName 
    FROM User
    INNER JOIN Marks
    ON User.id = Marks.user_id
    

    Here is a helpful resource for SQL joins

    【讨论】:

    • 好的,但是如何总结每个用户的分数。
    • 在 select 子句中添加 SUM(score) 就可以了。
    猜你喜欢
    • 2013-04-12
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    相关资源
    最近更新 更多