Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 选择具有最大值的行数_Mysql_Group By_Max - Fatal编程技术网

Mysql 选择具有最大值的行数

Mysql 选择具有最大值的行数,mysql,group-by,max,Mysql,Group By,Max,工作示例: 我有三个表,一个用户表、一个用户组表和一个链接表 链接表包含用户添加到用户组的日期。我需要一个查询,返回每个组中当前的用户数。最近日期确定用户当前所在的组 SELECT user_groups.name, COUNT(l.name) AS ct, GROUP_CONCAT(l.`name` separator ", ") AS members FROM user_groups LEFT JOIN (SELECT MAX(added), group_i

工作示例:

我有三个表,一个用户表、一个用户组表和一个链接表

链接表包含用户添加到用户组的日期。我需要一个查询,返回每个组中当前的用户数。最近日期确定用户当前所在的组

SELECT
  user_groups.name, 
  COUNT(l.name) AS ct, 
  GROUP_CONCAT(l.`name` separator  ", ") AS members 
FROM user_groups
  LEFT JOIN 
    (SELECT MAX(added), group_id, name FROM link LEFT JOIN users ON users.id = link.user_id GROUP BY user_id) l 
    ON l.group_id = user_groups.id
GROUP BY user_groups.id
我的问题是我写的查询是否可以优化,或者写得更好

谢谢!
Ben

你的实际查询并没有给出你想要的答案;至少,就我理解你的问题而言。John实际上于2017年1月5日加入了第2组,但在您的结果中,第1组(他于2017年1月1日加入)上显示了这一点。请注意,您还缺少一个第4组


使用标准SQL,我认为下一个查询就是您要查找的。查询中的注释应阐明每个部分正在做什么:

SELECT
    user_groups.name AS group_name, 
    COUNT(u.name) AS member_count, 
    group_concat(u.name separator ', ') AS members 
FROM 
    user_groups
    LEFT JOIN
    (
       SELECT * FROM 
       (-- For each user, find most recent date s/he got into a group
       SELECT 
           user_id AS the_user_id, MAX(added) AS last_added
       FROM 
           link 
       GROUP BY 
           the_user_id
       ) AS u_a
       -- Join back to the link table, so that the `group_id` can be retrieved
       JOIN link l2 ON l2.user_id = u_a.the_user_id AND l2.added = u_a.last_added
    ) AS most_recent_group ON most_recent_group.group_id = user_groups.id

    -- And get the users...
    LEFT JOIN users u ON u.id = most_recent_group.the_user_id
GROUP BY 
   user_groups.id, user_groups.name
ORDER BY
   user_groups.name ;
这可以在MySQL中以一种更紧凑的方式编写(滥用了一个事实,即在MySQL的旧版本中,它没有遵循SQL标准中的
groupby
限制)

这就是您将得到的:

group_name | member_count | members :--------- | -----------: | :------------- Group 1 | 2 | Mikie, Dominic Group 2 | 2 | John, Paddy Group 3 | 0 | null Group 4 | 1 | Nellie
dbfiddle

您实际的查询并没有给出您想要的答案;至少,就我理解你的问题而言。John实际上于2017年1月5日加入了第2组,但在您的结果中,第1组(他于2017年1月1日加入)上显示了这一点。请注意,您还缺少一个第4组


使用标准SQL,我认为下一个查询就是您要查找的。查询中的注释应阐明每个部分正在做什么:

SELECT
    user_groups.name AS group_name, 
    COUNT(u.name) AS member_count, 
    group_concat(u.name separator ', ') AS members 
FROM 
    user_groups
    LEFT JOIN
    (
       SELECT * FROM 
       (-- For each user, find most recent date s/he got into a group
       SELECT 
           user_id AS the_user_id, MAX(added) AS last_added
       FROM 
           link 
       GROUP BY 
           the_user_id
       ) AS u_a
       -- Join back to the link table, so that the `group_id` can be retrieved
       JOIN link l2 ON l2.user_id = u_a.the_user_id AND l2.added = u_a.last_added
    ) AS most_recent_group ON most_recent_group.group_id = user_groups.id

    -- And get the users...
    LEFT JOIN users u ON u.id = most_recent_group.the_user_id
GROUP BY 
   user_groups.id, user_groups.name
ORDER BY
   user_groups.name ;
这可以在MySQL中以一种更紧凑的方式编写(滥用了一个事实,即在MySQL的旧版本中,它没有遵循SQL标准中的
groupby
限制)

这就是您将得到的:

group_name | member_count | members :--------- | -----------: | :------------- Group 1 | 2 | Mikie, Dominic Group 2 | 2 | John, Paddy Group 3 | 0 | null Group 4 | 1 | Nellie
dbfiddle

所以你实际上不需要组目录?显示用户列表会很好,但如果这会有很大的不同,我可以削减该功能。所以你实际上不需要组目录?显示用户列表会很好,但如果它能带来巨大的收益,我可以削减它的功能difference@Ben这里提供的第一个解决方案与我所做的完全一样,而且很可能是最优的。任何进一步的改进都取决于索引的勤奋使用。非常感谢!如果不太麻烦的话,你能告诉我为什么我的查询不能正常工作吗?@Ben这里提供的第一个解决方案与我所做的完全一样,而且很可能是最优的。任何进一步的改进都取决于索引的勤奋使用。非常感谢!如果不太麻烦的话,你能给我一个指针,说明为什么我的查询不能正常工作吗?