MYSQL为每个用户选择最快时间和最低点击次数

MYSQL为每个用户选择最快时间和最低点击次数,mysql,greatest-n-per-group,Mysql,Greatest N Per Group,我真的很难创建一个select语句,它将以每个用户最快的时间返回记录。 如果秒数相同,则应选择最低的“点击次数” 如果我的表中有以下记录 user seconds clicks 1 10.23 10 1 10.12 12 1 10.12 14 2 12.11 16 3 12.34 18 3 12.00 16 我需要每个用户的最低时间和点击

我真的很难创建一个select语句,它将以每个用户最快的时间返回记录。 如果秒数相同,则应选择最低的“点击次数”

如果我的表中有以下记录

user    seconds     clicks
1       10.23       10
1       10.12       12
1       10.12       14
2       12.11       16
3       12.34       18
3       12.00       16
我需要每个用户的最低时间和点击次数,所以我需要返回一个查询

user    seconds    clicks
1       10.12       12
2       12.11       16
3       12.00       16
我试过的问题是

select user, min(seconds), min(clicks) from mytable group by user
但它选择秒10.12,并为用户1单击10,这是不正确的。
我可以在1个查询中执行此操作吗?

尝试使用self进行内部连接,如下所示:

 select a.user, a.seconds, a.clicks 
 from mytable a JOIN
      (SELECT user, min(seconds) as MIN_SECONDS
       FROM mytable 
       GROUP BY USER) AS b
 ON a.user = b.user AND a.seconds = b.MIN_SECONDS;

这是经常出现的最大n个组问题的变体

SELECT m.*
FROM mytable AS m
LEFT OUTER JOIN mytable AS m2 ON m.user = m2.user
  AND (m.seconds > m2.seconds OR m.seconds = m2.seconds AND m.clicks > m2.clicks)
WHERE m2.user IS NULL;
说明:

我们希望m是每一个拥有最低秒数的用户的行,或者如果有最低秒数的平局,则是最低点击数。换言之,该用户的秒数或点击次数应不低于其他行

使用排除联接尝试查找秒数较低或单击次数较低的任何行。如果没有找到这样的行,那么m是具有最低值的行

若一个用户有多行且点击次数最少,那个么仍然有可能出现平局并返回多行。在这种情况下,您需要解决与其他列的关联,希望是唯一的列

例如:

SELECT m.*
FROM mytable AS m
LEFT OUTER JOIN mytable AS m2 ON m.user = m2.user
  AND (m.seconds > m2.seconds OR m.seconds = m2.seconds AND (m.clicks > m2.clicks
  OR m.clicks = m2.clicks AND m.id > m2.id))
WHERE m2.user IS NULL;
这应该行得通

SELECT c.userid, c.seconds, min(c.clicks) FROM clicks as c
INNER JOIN (select userid, min(seconds) as s from clicks group by userid) AS sq 
ON (c.userid=sq.userid AND c.seconds=sq.s) group by c.userid;
但如果没有任何参与,这是不可能的


您可能需要更改列和表的名称。

谢谢Yogendra,但该查询选择0行:此解决方案无法使用。秒的值取自组中的任意行,而不是秒数最少的行。因此HAVING子句中的表达式是不明确的,并且返回未定义的结果。HAVING用于排除整个组,而不是行。@BillKarwin:我用self-join查询更新了答案。希望这能起作用。它可以找到每个用户秒数最少的行,但它不能满足OP的另一个要求,即在出现平局时找到点击次数最少的行。