我有这个SQL查询(我使用的是MySQL 8.0.35):

SELECT MAX(su) as value, activity_id, user_id, u.faculty_id AS faculty_id
    FROM (
        SELECT SUM(s.distance) as su, s.activity_id as activity_id, s.user_id as user_id, s.date
            FROM submission s
            WHERE s.week = 2 AND s.accepted = 1 AND s.season_id = 859
            GROUP BY s.date, s.user_id, s.activity_id
    ) as sums
INNER JOIN user u ON user_id = u.id
GROUP BY activity_id;

它所做的是:计算最大距离和,并获取"其他"相关列. 在结果中,可以有多行(理想情况下每个活动一行).

但是,它为"Factoryid"列返回了不正确的值.

我try 使用几个不同的WHERE子句将USER表上的INTERN JOIN放在嵌套的SELECT中,但似乎没有返回正确的结果.

部分用户表:

Partial user table

Partial submission table: Partial submission table

有了这些数据,我预计结果将是:

value activity_id user_id faculty_id
456 743 265 3375
456 744 265 3375

但是,我得到的结果是(请注意anteach_id):

value activity_id user_id faculty_id
456 743 265 3373
456 744 265 3375

推荐答案

根据我在上面注释中的链接,以这种方式滥用GROUP BY将为既不聚合也不分组依据的列返回任意且不确定的结果.

相反,"每个组的最大n"的正常方法是使用row_number()...

WITH
  sub AS
(
  SELECT
    SUM(s.distance) as su,
    s.activity_id as activity_id,
    s.user_id as user_id,
    s.date
  FROM
    submission s
  WHERE
        s.week = 2 
    AND s.accepted = 1
    AND s.season_id = 859
  GROUP BY
    s.date,
    s.user_id,
    s.activity_id
),
  sorted AS
(
  SELECT
    *,
    ROW_NUMBER() OVER (
      PARTITION BY activity_id
          ORDER BY su DESC
    )
      AS su_rank
  FROM
    sub
)
SELECT
  *
FROM
  sorted AS s
INNER JOIN
  user   AS u
    ON u.id = s.user_id
WHERE
  s.su_rank = 1

Mysql相关问答推荐

SQL计算不同的列并返回所有行

Python MySQL-无法从数据库中删除行

使用字符串文字与使用日期文字时的SQL行为

MySQL grant语句中的用户名区分大小写

将上传文件的存储路径放在一张表中的缺点是什么?

Select 构成每天聚合 MAX 的各个行

如何将多个字符串插入变量

如何进行查询以在两个不同的列中搜索两个不同的数据字符串?

在 MySQL 中,如何对 LIKE 查询进行批量更新,删除字符?

如何找到每个user_id每个产品的买家类型数量?

估计对大表进行分区所需的时间

我在 mysql 查询中需要帮助,我想在年龄之间按年龄过滤器分组,并显示 0 计数之间找不到的数据

MySQL - 如何查询涉及前面计算值的表结果

通过 Gorm 查询模型

mysql 5.5;可以从记录中排除表吗?

如何在 SQL 中的一行中查找最小值和最大值?

如何存储重复日期牢记夏令时

如何在 MySQL 的日期时间字段中存储 NULL 值?

MySQL - 错误 1045 - 访问被拒绝

邮箱地址可接受的字段类型和大小?