MySQL:有限行选择的 SUM 连接表

标签 mysql sql join subquery correlated-subquery

我遇到类似于 this question 的问题但有点复杂,我无法弄清楚如何有效地做到这一点。给定两张表,一张包含运动员列表,一张包含他们参加过的比赛列表,例如,

运动员

  • ID
  • 姓名
  • 性别
  • 详细信息

比赛

  • athlete_id
  • 年份
  • 积分

我想仅使用前 4 名比赛成绩(其中“顶部”由分数定义),按性别对给定年份内的所有运动员进行排名。我觉得我应该能够在子查询中执行此操作,但我不知道如何从内部引用外部查询。我现在的样子是这样的:

SELECT SUM(points) as points, a.* FROM
(SELECT rr.points, inner_a.id as athlete_id 
FROM athletes_raceresult rr 
INNER JOIN athletes_athlete inner_a ON rr.athlete_id = inner_a.id
WHERE inner_a.gender ='m' AND rr.year BETWEEN 2012 AND 2014 
AND inner_a.id = a.id
ORDER BY rr.points DESC) as races 
INNER JOIN athletes_athlete a ON races.athlete_id = a.id
GROUP BY races.athlete_id 
ORDER BY points DESC

但这并不将每位运动员的得分限制为 4 行。看起来我想要一个 correlated subquery ,但我无法让它发挥作用。

最佳答案

以下SQL Fiddle示例说明了如何做到这一点:

SELECT SUM(rr.points), a.id 
FROM athletes_raceresult AS rr 
INNER JOIN athletes_athlete AS a ON rr.athlete_id = a.id
WHERE (
  SELECT count(crr.points)
  FROM athletes_raceresult AS crr 
  INNER JOIN athletes_athlete AS ca ON crr.athlete_id = ca.id
  WHERE ca.gender = 'm' 
  AND crr.year BETWEEN 2012 AND 2014 
  AND crr.athlete_id = a.id AND crr.points >= rr.points
) <= 4
AND a.gender = 'm' 
AND rr.year BETWEEN 2012 AND 2014 
GROUP BY a.id

关于MySQL:有限行选择的 SUM 连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19820529/

相关文章:

mysql - 将关键数据存储到 MySQL 数据库中

php - 在 if 语句中测试 PDO 查询是否也会运行它?

mysql - 自动删除连接数据以及删除记录?

php - Full Outer Join(左联并右联)MySQL多表

php - LIMIT 与 JOIN 使用 Zend Framework

mysql - 如何选择带条件的2个表并显示所有数据

php - 将表单数据插入 MySQL?

sql - 大表中的 ORDER BY 慢

sql - 使用TABLOCKX的SQLserver多线程锁定

sql - 如何在不显式定义连接表的情况下在sequelize中创建三向连接表