Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL按日期时间顺序选择不同的值_Mysql - Fatal编程技术网

MySQL按日期时间顺序选择不同的值

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; 结果: 结果: 但是我得到的结果是错误的。

我英语说得不好,但我会尽力的

我有两张桌子

表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;
结果:

结果:

但是我得到的结果是错误的。 如果不选择所有行,我不知道该怎么办,这比我实际制作的方式要慢

有什么想法吗?

您可以加入表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);