【问题标题】:How to sum values when joining tables?连接表时如何对值求和?
【发布时间】:2011-02-09 03:17:42
【问题描述】:

<hyperbole>回答这个问题的人都可以声称自己解决了世界上最具挑战性的 SQL 查询,根据你的真实情况。</hyperbole>

使用 3 个表格:用户、徽章、奖励。

关系:用户有很多奖励;奖励属于用户;徽章有很多奖项;奖品属于徽章。所以 badge_id 和 user_id 是 Awards 表中的外键。

这里的业务逻辑是,每次用户赢得徽章时,他/她都会收到它作为奖励。一个用户可以多次获得相同的徽章。每个徽章都分配有一个指定的点值(point_value 是徽章表中的一个字段)。例如,BadgeA 可以值 500 分,BadgeB 可以值 1000 分,等等。再举一个例子,假设 UserX 赢得了 10 次 BadgeA 和 5 次 BadgeB。 BadgeA 500 Points,BadgeB 1000 Points,UserX 累计10000 Points ((10 x 500) + (5 x 1000))。

这里的最终游戏是返回累积徽章积分最多的前 50 名用户的列表。

你能做到吗?

【问题讨论】:

  • 大声笑...是的,如果 stackoverflow 允许我将赏金转移给你
  • 为什么要作为 SQL 查询来执行此操作?
  • 这是作业吗?如果是这样,请标记为这样。
  • @keruilin:我知道将您当前的问题自我评估为“世界上最难的问题”应该很有趣。但实际上它不是,既不是世界上最难的问题,也不是有趣的问题。 ;) 请给它一个适当的标题,至少谷歌可以更容易地找到这个线程。

标签: sql mysql


【解决方案1】:

我的示例表是:

用户:

+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id    | int(11)      | YES  |     | NULL    |       |
| name  | varchar(200) | YES  |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+

徽章:

+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
| score | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+

奖项:

+----------+---------+------+-----+---------+-------+
| Field    | Type    | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| id       | int(11) | YES  |     | NULL    |       |
| user_id  | int(11) | YES  |     | NULL    |       |
| badge_id | int(11) | YES  |     | NULL    |       |
+----------+---------+------+-----+---------+-------+

因此查询是:

SELECT user.name, SUM(score)
  FROM badge JOIN award ON badge.id = award.badge_id
       JOIN user ON user.id = award.user_id
 GROUP BY user.name
 ORDER BY 2
 LIMIT 50

【讨论】:

  • 我认为提问者对用户和分数都感兴趣。
  • 'ORDER BY 2' 表示按我们选择的第二个字段排序。当您的 SELECT 项目之一是对一个或多个字段的一长串操作时,它特别有用。哦,别忘了 ORDER BY 2 DESC,因为我猜默认是 ASCending。
【解决方案2】:

不,这不是世界上最具挑战性的查询。像这样简单的事情应该可以做到:

select u.id, u.name, sum(b.points) as Points
from users u
inner join awards a on a.user_id = u.id
inner join badges b on b.id = a.badge_id
group by u.id, u.name
order by 2 desc
limit 50

【讨论】:

    猜你喜欢
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 2021-10-09
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    相关资源
    最近更新 更多