MySQL 选择每个运动员的最佳(和最老)表现、类别

标签 mysql sql join group-by greatest-n-per-group

我正在尝试从下表构建 SQL 查询(示例):

Example of table with name "performances"

这是带有运动表现的表格。我想从这个表中选择每个学科和一组一个或多个类别的最佳表现。尽管每个运动员的最佳表现值是成绩表中的两倍或更多,但他只能获得一次成绩。

Here is expected result from table "performances"

实际上我有这个 SQL 查询,但是从子查询中连接所有具有运动员 ID 和最佳值最佳值的行:

SELECT 

p.athlete_id, p.value 

FROM

(SELECT athlete_id, MAX(value) AS best FROM performances 

WHERE discipline_id = 32 AND category_id IN (1,3,5,7,9) 

GROUP BY athlete_id) f

INNER JOIN performances p 

ON p.athlete_id = f.athlete_id AND p.conversion = f.best

ORDER BY p.value DESC, p.created 

请问,如何为每个运动员只加入一行,该运动员具有最旧创建的属性?

最佳答案

要根据最大值value获取每个discipline的每个athlete的单行,您可以执行自左连接,以处理平局情况或者如果单个运动员有超过1行具有相同的最大值,您可以使用case语句来选择日期最旧的行

select a.*
from performances a
left join performances b
on a.discipline_id = b.discipline_id
and a.athlete_id = b.athlete_id
and case when a.value = b.value
    then a.created > b.created
    else a.value < b.value
    end 
where b.discipline_id is null

DEMO

此外,您可以在 where 子句中添加过滤器

and a.discipline_id = 32 
and a.category_id IN (1,3,5,7,9)

DEMO

关于MySQL 选择每个运动员的最佳(和最老)表现、类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48247977/

相关文章:

php - CodeIgniter 中带有 if 语句的两个插入查询

java - JDBC:更新表的最佳方法?

mysql - 将索引提升为主键

python - 使用 python 将两个文件中的每一行连接为一行

java - 使用 java 的 MySQL 数据库恢复代码无法正常工作,导致应用程序没有响应

php - Doctrine 不会从已存在的实体类创建新表?

java - 如何使用 JDBC 连接到远程数据库?

java - 在 SQLite 中查询日期的月份部分

r - 执行 st_union() 操作后如何将多多边形几何体分成多个多边形对象?

mysql - 在 mysql 中应用多个联接时提高性能