【问题标题】:MySQL: SUM Joined Table on Limited Selection of RowsMySQL:关于有限行选择的 SUM 连接表
【发布时间】:2013-11-18 04:31:46
【问题描述】:

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

运动员

  • 身份证
  • 姓名
  • 性别
  • 详情

比赛

  • 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,但我无法让它工作。

【问题讨论】:

  • 您是否希望显示每位运动员在他们完成的前 4 名中的每个点的分数?
  • 不,只是总和。
  • “前 4 名比赛结束”在哪里适合您的查询?
  • 你能在sqlfiddle.com提供一些示例数据吗?

标签: mysql sql join subquery correlated-subquery


【解决方案1】:

以下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

【讨论】:

    猜你喜欢
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 2016-04-13
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多