обновление + порядок в том же запросе MySQL - PullRequest
2 голосов
/ 25 января 2012

Это мои структуры таблиц:

Table1: track_data

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

- Идентификатор магазина, координаты местоположения, активность - момент времени, когда они были вставлены.


Таблица 2: user_devices

| device_id(primary) | park_lat | park_long |

Сохраняет идентификатор, park_lat / park_long необходимо хранить с широтой / долготой из таблицы track_data по запросу (т. Е. Последние данные активности).Теперь, как я буду хранить последнюю широту / долготу от таблицы 1 до таблицы 2 в одном запросе.Возможно ли это, чтобы смешать выбор и обновление в одном запросе?

А теперь мой не функционирующий интуитивно понятный запрос:)

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)

1 Ответ

1 голос
/ 25 января 2012
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
  • Наконец мы обновляем столбцы

Этозапрос будет работать очень хорошо, потому что он не выполняет запрос по строке, как это делают некоторые люди инстинктивно.

...