MySQL - 查询Order By无法按预期工作的地方

时间:2012-12-10 14:14:21

标签: mysql sql-order-by

我期望生成的“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

任何人都知道为什么? 如何改进?

谢谢!

2 个答案:

答案 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