<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位用户列表。
你能做到吗?
答案 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