在同一查询 mysql 中更新+order by

发布于 2024-12-29 06:56:51 字数 678 浏览 1 评论 0原文

她是我的表结构:

Table1:track_data

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

-存储 id、位置坐标、活动(它们被插入的时刻)。


表2:user_devices

| 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)

Her are my table structures:

Table1:track_data

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

-Stores id, location co-ordinates, activity being the time instant they were inserted.


Table2:user_devices

| device_id(primary) | park_lat | park_long |

Stores id, park_lat/park_long need to be stored with latitude/longitude from track_data table on request(i.e., the latest activity data).
Now, how will i store the latest latitude/longitude from Table1 to Table2, in a single query. Is this possible, To mix select and update in same query?

And now my non-functioning intuitive query:)

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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

云朵有点甜 2025-01-05 06:56:51
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 的第一条记录(最新的,因为我们是这样排序的)
  • 然后我们将其连接到我们的表中,因此我们只需要一次传递over track_data
  • 最后我们更新列

这个查询将执行得非常好,因为它不像有些人本能地那样每行执行一次查询。

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;

How this works:

  • The inner-most query orders by device_id then activity latest first
  • The next layer gets just the first record for each device_id (the latest, because we ordered it thus)
  • We then join this to our table so we only need one pass over track_data
  • Finally we update the columns

This query will perform very well, because it isn't doing a query per row like some people would instinctively do.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文