2014-09-29 3 views
0

Я постараюсь сделать себя как можно более ясным.UPDATE sql column с наибольшим значением из другого столбца

У меня есть две таблицы, одна из которых называется Users, другая называется Users_status.

Таблица Пользователи

column 1 : id (pk) 
column 2 : status (fk) 

Таблица Users_status

column 1 : user_id (fk) 
column 2 : user_status (fk) 

Я хочу сделать хрон, что verifys, что столбец 2 из таблицы пользователей до даты колонки 2 таблицы Users_status Таблица Users_status может иметь несколько раз повторение user_id, с приращением user_status, например:

Таблица Users_status

user_id : 1 
user_status : 1 

user_id : 1 
user_status : 2 

user_id : 1 
user_status : 3 

user_id : 2 
user_status : 1 

user_id : 2 
user_status : 2 

Я хочу, чтобы с 1 просьбой, чтобы обновить второй столбец таблицы пользователей (статус) в соответствии с последним (самый высокий) user_status присутствует в таблице Users_status Я также хочу чтобы не обновлять строки, у которых уже есть хороший статус (тот же статус, что и таблица Users_status)

Как это можно сделать? Я пробовал так много вещей, и когда я работал над этим, он либо просто менял статус с 1 на 2, и 2 на 1, либо некоторые ошибки ограничений MYSQL.

Я бы очень рад, если кто-то может помочь мне в этом

Спасибо,

+0

особо ВЫСОКИЙ статус, независимо от того, какой статус LAST указан для данного пользователя. – DRapp

ответ

1

Вы можете использовать присоединиться к подзапрос для этого

UPDATE users 
JOIN (SELECT 
     user_id, 
     MAX(status) status 
     FROM 
     users_status 
     GROUP BY user_id 
    ) st 
ON users.id = st.user_id 
SET users.status = st.status 
WHERE users.status < st.status 
+0

Спасибо, что отлично выполнил эту работу, я думаю, что мне не хватало группу по частям, и я до сих пор не понимаю почему – Enjoyted

0

Этот запрос работает для меня:

update users set status = case when id <> (select b.j from (select m.id j 
from users m join users_status n on m.id=n.user_id and m.status=n.user_status) b) then 
(select max(user_status) from users_status group by user_id having 
users_status.user_id=users.id) 
    else status END; 
Смежные вопросы