OK, try this.
(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
This is a pattern of some sort, I've seen it used by DBAs very often.
But this above will give you >=2 rows per user, per distance
(if the user achieved his best time more than once).
If you want e.g. the first date on which he achieved his
best result then you can try this second query below.
In (2) basically the query (1) is used as subquery.
(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
OK, and now I tested both queries.
So now I'm relaxed as I indeed didn't lie to you :) with any of the two queries.
Simplified version of (2) (for a particular user) would be this one.
(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)
Here is the schema and the data I tested my queries on.
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);