2014-01-05 5 views
0

Theres a note таблица, где каждый пользователь может иметь несколько заметок. У меня есть таблица пользователей с колонкой last_note, которая равна null, и ее необходимо заполнить на основе последней заметки для каждого пользователя в таблице notes.Обновление записей на основе группы по заказам

Для того, чтобы выбрать самую последнюю ноту для каждого пользователя я сделал:

SELECT * FROM users 
GROUP BY user_id 
ORDER BY tm DESC 

Однако, я не могу включить группу по и порядок пунктами, чтобы мой запрос обновления по очевидным причинам:

UPDATE users u 
JOIN note n 
ON u.id = n.user_id 
SET u.last_note = n.note 
GROUP BY n.user_id 
ORDER BY n.tm DESC 

Мне было интересно, может ли кто-нибудь помочь мне выяснить, как я могу это сделать.

Заранее благодарен!

+1

Почему хранить это вообще? – Strawberry

+0

@ Струберри, я согласен! Это то, как была построена система, я не могу ее изменить, только чтобы добавить к существующей архитектуре. – AnchovyLegend

+0

Не понимаю. Если у вас нет возможности изменить его, то как вы его меняете? – Strawberry

ответ

1

Попробуйте это:

UPDATE users u 
INNER JOIN (SELECT n.user_id, n.note 
      FROM note n 
      INNER JOIN (SELECT n.user_id, MAX(n.noteId) noteId 
         FROM note n GROUP BY n.user_id 
         ) AS A ON n.user_id = A.user_id AND n.noteId = A.noteId 
      ) n ON u.id = n.user_id 
SET u.last_note = n.note 

ИЛИ

UPDATE users u 
INNER JOIN (SELECT n.user_id, n.note 
      FROM (SELECT n.user_id, n.note 
        FROM note n ORDER BY n.user_id, n.noteId DESC 
       ) n 
      GROUP BY n.user_id 
      ) n ON u.id = n.user_id 
SET u.last_note = n.note 
+0

Если это работает, это происходит из-за недокументированного поведения MySQL (если вы не включите раздел комментариев на соответствующую страницу руководства). В результате я нахожу это немного неудовлетворительным. – Strawberry

+0

@Strawberry Проверьте мой обновленный ответ –

+0

Cool - но у вас есть больше подзапросов, чем вам нужно! – Strawberry

Смежные вопросы