I have a table foo
that looks like this:
x
+----------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+-------------------+----------------+
| id | int(10) | NO | PRI | NULL | auto_increment |
| ts | timestamp | NO | | CURRENT_TIMESTAMP | |
| user | varchar(255) | YES | MUL | NULL | |
| a | varchar(255) | YES | MUL | NULL | |
| b | varchar(255) | YES | MUL | NULL | |
| c | float | YES | | NULL | |
+----------+--------------+------+-----+-------------------+----------------+
For each set of distinct (user, a, b), I’d like to select the most recent timestamp and the value c
I’ve tried a few variations of the following without any luck
select distinct user, b, c, ts as ts_b
from (select max(ts) as ts_a from foo as max_ts)
where ts_a = ts_b;
Advertisement
Answer
How about
select user,b,c, max(ts) as ts_b from foo
group by user,b,c
UPDATE
you can use this subquery to get what you need. f2 will be the foo row that matches the distinct user
,a
,b
and has the latest ts
. This is equivalent to the CROSS APPLY statement in MSSQL.
select f2.user,f2.a, f2.b,f2.c, f2.ts
from
(select distinct user,a, b from foo) f1
inner join foo f2
on f2.id =
(select id
from foo f3
where f3.user=f1.user and f3.a = f1.a and f3.b=f1.b
order by f3.ts desc
limit 1
)