MySQL按日期时间顺序选择不同的值
我英语说得不好,但我会尽力的 我有两张桌子 表1 但根据该用户的注册数量,我必须进行大量查询。 我不知道是否有可能通过单一选择来改善我的工作方式,但这正是我所尝试的:MySQL按日期时间顺序选择不同的值,mysql,Mysql,我英语说得不好,但我会尽力的 我有两张桌子 表1 但根据该用户的注册数量,我必须进行大量查询。 我不知道是否有可能通过单一选择来改善我的工作方式,但这正是我所尝试的: SELECT car_id, datetime, lat, lon from table1 INNER JOIN table2 on carid = car_id WHERE user = 'user1' GROUP BY carid ORDER BY datetime DESC; 结果: 结果: 但是我得到的结果是错误的。
SELECT car_id, datetime, lat, lon from table1
INNER JOIN table2 on carid = car_id
WHERE user = 'user1'
GROUP BY carid
ORDER BY datetime DESC;
结果:
结果:
但是我得到的结果是错误的。
如果不选择所有行,我不知道该怎么办,这比我实际制作的方式要慢
有什么想法吗?您可以加入表2两次,一次获取每个carId的maxdatetime,第二次获取与carId和datetime关联的lat和lon:
看
您对max的查询返回了错误的lat和lon值,因为您只按carid进行分组,所以MySQL可以在选择列表中任意选择不在聚合函数或GROUP by中的列的值。这种行为是由于
从MySQL文档:
MySQL扩展了GROUPBY的使用,因此select列表可以引用GROUPBY子句中未命名的未聚合列。。。您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这主要是在GROUP BY中未命名的每个未聚合列中的所有值对于每个组都相同时才有用。服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的。此外,添加ORDERBY子句不会影响从每个组中选择值。结果集的排序发生在选择值之后,排序依据不影响服务器选择的值
为了确保返回正确的值,您需要使用与上面类似的子查询 我认为下面的查询应该适用于您的场景。我没有尝试过同样的方法,因为我没有数据
SELECT
t1.carid, t2.datetime, t2.lat, t2.lon
FROM
table1 t1 JOIN table2 t2
ON t1.carid = t2.carid AND t1.user='user1'
GROUP BY
carid
HAVING
t2.datetime=MAX(datetime);
让我知道这是否有效。+1了解一个包含表格数据的书面问题,以及您如何尝试解决问题。感谢您花时间回答。这种方法确实按照我想要的方式工作,但不幸的是,它比我解释的方式需要更多的时间。标记为答案。@Sagevalle您的表中有索引吗?有,在表1“carid”和“user”以及表2“carid”中。 carid datetime lat lon -------------------------------------------------- A001 | 2013-25-06 10:10:00 | -23.0700 |-46.1200 A002 | 2013-25-06 10:02:00 | -24.3800 |-45.3300
`SELECT carid FROM table1 where user = “user1”;`
carid
-----
A001
A002
SELECT * FROM table2 WHERE car_id='A001' ORDER BY datetime DESC limit 1
SELECT * FROM table2 WHERE car_id='A002' ORDER BY datetime DESC limit 1
SELECT car_id, datetime, lat, lon from table1
INNER JOIN table2 on carid = car_id
WHERE user = 'user1'
GROUP BY carid
ORDER BY datetime DESC;
carid datetime lat lon
------------------------------------------------------
A002 | 2013-25-06 10:01:00 | -24.3500 | -45.3200
A001 | 2013-25-06 10:02:00 | -23.0000 | -46.0000
SELECT car_id, MAX(datetime) as datetime, lat, lon from table1
INNER JOIN table2 on carid = car_id
WHERE user = 'user1'
GROUP BY carid
ORDER BY datetime DESC;
carid datetime lat lon
------------------------------------------------------
A001 | 2013-25-06 10:10:00 | -23.0000 | -46.0000
A002 | 2013-25-06 10:02:00 | -24.3500 | -45.3200
select t1.carid, t2.datetime, t2.lat, t2.lon
from table1 t1
inner join
(
-- get the lat/lon associated with each carid and max datetime
select t2.carid, t2.datetime, t2.lat, t2.lon
from table2 t2
inner join
(
-- get the max datetime for each carid
select carid, max(datetime) datetime
from table2
group by carid
) d
on t2.carid = d.carid
and t2.datetime = d.datetime
) t2
on t1.carid = t2.carid
where user = 'user1';
SELECT
t1.carid, t2.datetime, t2.lat, t2.lon
FROM
table1 t1 JOIN table2 t2
ON t1.carid = t2.carid AND t1.user='user1'
GROUP BY
carid
HAVING
t2.datetime=MAX(datetime);