【问题标题】:update+order by in same query mysql在同一查询mysql中更新+排序
【发布时间】:2012-02-18 15:54:53
【问题描述】:

她是我的表结构:

表 1:track_data

| device_id(foreign) | latitude | longitude | activity |

-存储 id、位置坐标、活动是它们被插入的时间。


表 2:用户设备

| device_id(primary) | park_lat | park_long |

商店 id、park_lat/park_long 需要根据请求(即最新的活动数据)与 track_data 表中的纬度/经度一起存储。 现在,我将如何在单个查询中存储从 Table1 到 Table2 的最新纬度/经度。这可能吗,在同一个查询中混合选择和更新?

现在我的直观查询不起作用:)

UPDATE user_devices,track_data
SET user_devices.park_lat = latitude,user_devices.park_long = longitude  
WHERE user_devices.id='33' AND track_data.activity=(SELECT activity FROM track_data 
ORDER BY track_data.activity DESC LIMIT 1)

【问题讨论】:

    标签: mysql select sql-order-by limit


    【解决方案1】:
    update user_devices 
    join (select device_id, latitude, longitude, activity
          from (select device_id, latitude, longitude, activity
              from track_data order by device_id, activity desc) x
          group by device_id) latest_lat_long on latest_lat_long.device_id = user_devices.device_id
    set 
    park_lat = latest_lat_long.latitude,
    park_long = latest_lat_long.longitude;
    

    这是如何工作的:

    • 按 device_id 排序的最内层查询订单,然后是最新活动优先
    • 下一层只获取每个 device_id 的第一条记录(最新的,因为我们是这样排序的)
    • 然后我们将它加入到我们的表中,因此我们只需要通过 track_data 一次
    • 最后我们更新列

    此查询将执行得非常好,因为它不像某些人会本能地那样对每行进行一次查询。

    【讨论】:

    • 感谢@Bohemian 的回答,更新最新的专栏。但是,我必须修改您的查询以传递单个 device_id 而不是对其进行分组。 update user_devices join (select device_id, latitude, longitude, activity from (select device_id, latitude, longitude, activity from track_data WHERE track_data.device_id='33' order by activity desc)x) latest_lat_long on latest_lat_long.device_id = user_devices.id set park_lat = latest_lat_long.latitude, park_long = latest_lat_long.longitude;
    猜你喜欢
    • 1970-01-01
    • 2014-11-16
    • 2019-03-12
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 2011-09-03
    • 1970-01-01
    相关资源
    最近更新 更多