如何在连接表时对值进行求和?

时间:2010-04-17 11:52:05

标签: sql mysql

<hyperbole>无论是谁回答这个问题,都可以为解决世界上最具挑战性的SQL查询提供信誉,真的是你的。</hyperbole>

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

关系:用户有很多奖项;奖项属于用户;徽章有很多奖项;奖项属于徽章。因此,badge_id和user_id是奖励表中的外键。

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

此处的最终游戏是返回累积最多徽章积分的前50位用户列表。

你能做到吗?

2 个答案:

答案 0 :(得分:5)

我的示例表是:

用户:

+-------+--------------+------+-----+---------+-------+
| 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

答案 1 :(得分:4)

不,这不是世界上最具挑战性的问题。像这样简单的东西应该这样做:

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