mysql - 如何仅获取具有最大值的行的 GROUP_CONCAT

标签 mysql sql group-by

假设我们有一张 table :

SELECT * FROM users_to_courses;
+---------+-----------+------------+---------+
| user_id | course_id | pass_date  | file_id |
+---------+-----------+------------+---------+
|       1 |         1 | 2014-01-01 |       1 |
|       1 |         1 | 2014-01-01 |       2 |
|       1 |         1 | 2014-02-01 |       3 |
|       1 |         1 | 2014-02-01 |       4 |
+---------+-----------+------------+---------+

架构:

CREATE TABLE `users_to_courses` (
  `user_id` int(10) unsigned NOT NULL,
  `course_id` int(10) unsigned NOT NULL,
  `pass_date` date NOT NULL,
  `file_id` int(10) unsigned NOT NULL,
  PRIMARY KEY (`user_id`, `course_id`, `pass_date`, `file_id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

一个用户可以多次通过某门类(class),每次通过可以生成多个证书。 user_idcourse_id 存储用户和类(class)表的链接。 file_id - 文件表,其中存储有关证书文件的信息。

在我们的示例中,用户 #1 已通过类(class) #1 两次,每次颁发 2 个证书:总共 4 条记录。

如何获取此数据:对于每门类(class)的 user_id=1,获取 MAX(pass_date) 以及附加到该日期的所有文件。到目前为止我只能得到这个:

SELECT
    users_to_courses.course_id,
    MAX(users_to_courses.pass_date) AS max_passed_date,
    GROUP_CONCAT(users_to_courses.file_id SEPARATOR ',') AS files   
FROM
    users_to_courses
WHERE
    users_to_courses.user_id=1
GROUP BY
    users_to_courses.course_id;

+-----------+-----------------+---------+
| course_id | max_passed_date | files   |
+-----------+-----------------+---------+
|         1 | 2014-02-01      | 1,2,3,4 |
+-----------+-----------------+---------+

我需要这个:

+-----------+-----------------+---------+
| course_id | max_passed_date | files   |
+-----------+-----------------+---------+
|         1 | 2014-02-01      |   3,4   |
+-----------+-----------------+---------+

我认为,这需要一个复合 GROUP BY。

fiddle

最佳答案

尝试下面的查询,它首先获取所有记录的最大日期,然后我们可以仅在外部查询中连接这些记录。您可以通过添加 group by utc.user_id

对多个用户使用同一查询
SELECT
    utc.course_id,
    mdt.maxDate AS max_passed_date,
    GROUP_CONCAT(utc.file_id SEPARATOR ',') AS files
FROM
    users_to_courses utc
    join
(SELECT MAX(pass_date) AS maxDate, course_id cId, user_id uId
        FROM users_to_courses GROUP BY user_id, course_id) AS mdt
ON
    mdt.uId = utc.user_id
AND
    mdt.cId = utc.course_id
AND 
    mdt.maxDate = utc.pass_date
WHERE
    utc.user_id=1
GROUP BY
    utc.course_id;

关于mysql - 如何仅获取具有最大值的行的 GROUP_CONCAT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24574305/

相关文章:

mysql - INSERT 与 LOAD DATA LOCAL INFILE 的速度

mysql - 我正在尝试在一个查询中从两个不同的表中选择数据

php - 如何通过按钮在 url 中发送护照号码?

c# - 如何使用 LINQ 获取多个总计

mysql - SQL 错误代码 1055。按组标记的最小日期

python - 无法将CSV文件数据导入mysql表

sql - 如果特定情况没有返回结果,则使用 count(*) 显示零

java - 基于线性时间搜索字符串对字符串进行排序

SQL函数问题

python - 如何在groupby中使用字符串 "mean"或 "sum"来动态化?