我真的很难创建一个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个查询中执行此操作吗?
答案 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;
但没有任何加入就无法完成。
您可能需要更改列和表的名称。