我期望生成的“user_id”与DESCending顺序中Location表中的第1条记录对应。 但是我在ASCending订单/或ID订单中获得了第一条记录的“user_id”。
SELECT Device.name, Location.user_id
FROM locations Location
LEFT JOIN devices Device
ON Device.id = Location.device_id
WHERE Device.id IN (491)
GROUP BY Location.device_id
ORDER BY Location.location_datetime DESC
任何人都知道为什么? 如何改进?
谢谢!
答案 0 :(得分:2)
您可以使用以下内容:
SELECT
devices.name,
(select locations.user_id
from locations
where locations.device_id = devices.id
order by locations.location_datetime desc
limit 1)
FROM
devices
WHERE
device.id = 491
您不能将group by
与非聚合列一起使用来获取第一个或最后一个记录:不能保证它始终有效。
编辑:如果您需要从地理位置选择多个字段,可以使用以下字段:
SELECT l1.*, devices.name
FROM
locations l1 inner join
(select device_id, max(location_datetime) as maxdt
from locations
group by device_id) l2
on l1.device_id = l2.device_id and l1.location_datetime=l2.maxdt
left join devices
on devices.id = l1.device_id
此查询将为每个device_id选择最后一个位置。如果有多个位置具有相同的最大日期时间,则此查询将返回每个位置。如果您只需要一个,并且不介意选择哪个,您还可以在最后添加GROUP BY l1.device_id
子句。
答案 1 :(得分:0)
试试这个
SELECT Device.name, Location.user_id ,Location.location_datetime
FROM locations Location
LEFT JOIN devices Device
ON Device.id = Location.device_id
WHERE Device.id IN (491)
ORDER BY Location.user_id DESC
GROUP BY Location.device_id