mysql - 查询每个距离的最佳时间

标签 mysql sql greatest-n-per-group

我有下表,其中 * 标记的列构成主键。它们基本上是划船训练,划船的距离(500、1000 等)以及所用的时间(以毫秒为单位)。

* user_id
* season
* n
  date
  meters
  time

我需要找到特定用户的个人最好成绩,因此每个距离的最短时间以及划船的日期。

我一直在试图解决这个问题,但是对于所有的子查询、加入和分组,我只是......失败了。有人可以帮助 SQL 新手吗?

<小时/>

我的最终解决方案基于已接受的答案。尝试稍微简化一下,因为我事先知道它是针对哪个用户的。还有仅挑选标准距离的条款。据我所知似乎可行,但如果您发现任何可疑之处,请告诉我!

SELECT
    MIN(x.date) "date", 
    x.meters, 
    x.time
FROM session x
INNER JOIN (SELECT
            z.date,
            z.meters,
            MIN(z.time) "time"
        FROM session z
        WHERE z.user_id = :user_id
          AND z.meters IN (500,1000,2000,5000,6000,10000,21097,42195,100000)
        GROUP BY z.meters) y 
    ON x.meters = y.meters AND x.time = y.time
GROUP BY x.meters, x.time

最佳答案

好的,试试这个。

(1)

    SELECT x.date, x.user_id, x.meters, x.time
    FROM
    MyTable x

    JOIN
    (
        SELECT y.user_id, y.meters, min(y.time) AS time
        FROM
        MyTable y
        GROUP BY y.user_id, y.meters
    ) t ON x.user_id = t.user_id AND x.time = t.time AND x.meters = t.meters

这是某种模式, 我经常看到 DBA 经常使用它。

但是上面的内容将为您提供>=每个用户每距离 2 行
(如果用户多次达到最佳成绩)。
如果你想要例如他第一次实现自己的目标的日期
最好的结果,那么您可以尝试下面的第二个查询。
在(2) 中,查询(1) 基本上用作子查询。

(2)

SELECT min(m.date), m.user_id, m.meters, m.time

FROM

    (

        SELECT x.date, x.user_id, x.meters, x.time
        FROM
        MyTable x

        JOIN
        (
            SELECT y.user_id, y.meters, min(y.time) AS time
            FROM
            MyTable y
            GROUP BY y.user_id, y.meters
        ) t ON x.user_id = t.user_id AND x.time = t.time AND x.meters = t.meters

    ) m

GROUP BY m.user_id, m.meters, m.time

好的,现在我测试了这两个查询。

所以现在我放松了,因为我确实没有说谎 给你:) 与任何两个查询。

(2) 的简化版本(对于特定用户)就是这个。

(3)

SELECT min(x.date), x.user_id, x.meters, x.time
FROM
MyTable x

JOIN
(
   SELECT y.user_id, y.meters, min(y.time) AS time
   FROM
   MyTable y
   where y.user_id = 1
   GROUP BY y.user_id, y.meters
) t ON x.user_id = t.user_id AND x.time = t.time AND x.meters = t.meters

GROUP BY x.user_id, x.meters, x.time

(4)

这是我测试查询的架构和数据。

create table MyTable(user_id int, season int, n int, date datetime, meters int, time int);

insert into MyTable values (1, 1, 10, '2010-01-08', 500, 10);
insert into MyTable values (1, 1, 20, '2010-01-10', 500, 10);

insert into MyTable values (1, 1, 30, '2010-01-10', 1000, 50);
insert into MyTable values (1, 1, 40, '2010-02-10', 1000, 50);
insert into MyTable values (1, 1, 50, '2010-03-10', 1000, 70);

insert into MyTable values (1, 1, 60, '2010-03-10', 5000, 20);
insert into MyTable values (1, 1, 70, '2010-04-10', 5000, 20);
insert into MyTable values (1, 1, 80, '2010-05-10', 5000, 50);

insert into MyTable values (2, 1, 90, '2010-01-10', 500, 10);
insert into MyTable values (2, 1, 100, '2010-01-08', 500, 10);

insert into MyTable values (2, 1, 110, '2010-01-11', 1000, 50);
insert into MyTable values (2, 1, 120, '2010-02-11', 1000, 50);
insert into MyTable values (2, 1, 130, '2010-03-11', 1000, 70);

insert into MyTable values (2, 1, 140, '2010-05-11', 5000, 20);
insert into MyTable values (2, 1, 150, '2010-06-11', 5000, 20);
insert into MyTable values (2, 1, 160, '2010-07-11', 5000, 50);

关于mysql - 查询每个距离的最佳时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20599116/

相关文章:

mysql - 查询返回空结果但数据存在

mySQL查询分组记录的前N个条目

SQL在2个表相同主键中选择newst数据

java - ClusterJ 在初始化域类型处理程序失败后删除架构

php - 插入查询以插入到 MySQL 数据库中不起作用。 (PHP)

mysql - MySQL中的collat​​ion_database、collat​​ion_connection、collat​​ion_server是干什么用的?

mysql - mysql中每组前N个Sql问题

php - 将每个数组日期与php中的mysql日期进行比较

asp.net - 在 c# asp.net 中执行查询

mysql - 将结果加入新表?