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

时间:2012-12-09 20:54:25

标签: 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

我需要每个用户的最短时间和点击次数,因此我需要一个返回的查询

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个查询中执行此操作吗?

3 个答案:

答案 0 :(得分:0)

尝试使用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;

答案 1 :(得分:0)

这是经常出现的greatest-n-per-group问题的变体。

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;

答案 2 :(得分:0)

这应该有效

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;

但没有任何加入就无法完成。

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