<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名用户的列表.
你可以做到吗?
我的样本表是:
用户:
+-------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(200) | YES | | NULL | |
+-------+--------------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)
徽章:
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| score | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)
奖:
+----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| user_id | int(11) | YES | | NULL | |
| badge_id | int(11) | YES | | NULL | |
+----------+---------+------+-----+---------+-------+
Run Code Online (Sandbox Code Playgroud)
因此查询是:
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
Run Code Online (Sandbox Code Playgroud)