2015-04-20 4 views
0

У меня есть таблица, которая содержит задачи, которые должны выполняться в определенное время. Для выполнения задание будет отмечено исполнителем с его идентификатором employeeID. С следующим SQL:Обновление MySQL только в том случае, если таблица содержит значение

UPDATE table1.jobs 
SET workerID=10 
WHERE workerID IS NULL and time < NOW() 
ORDER BY time LIMIT 1 

Я могу отметить самую старую не отмеченную работу.

Теперь я хочу, чтобы это было выполнено, только если есть уже не работа, отмеченная workerID 10.

Возможно ли это в одном запросе?

ответ

0

Вы можете сделать worker_id as Unique key, и все готово. Если employeeID 10 уже присутствует в вашей таблице, ваш запрос UPDATE никогда не будет выполняться.

0
UPDATE table1.jobs 
SET workerID=10 
WHERE workerID IS NULL 
and time < NOW() 
and not exists (select 1 from table1.jobs where workerID=10) 
ORDER BY time 
LIMIT 1 
0

В MySQL вы можете указать только обновляемую таблицу в предложении join. Таким образом, вы можете выразить то, что вы хотите, как:

UPDATE table1.jobs j CROSS JOIN 
     (select count(*) as cnt, 
       min(case when workerId is null then time end) as min_nulltime 
     from table1.jobs 
     where workerId = 10 
     ) j10 
    SET workerID = 10 
    WHERE j10.cnt = 0 and j.workerID IS NULL and j.time = j10.min_nulltime 
LIMIT 1; 

Потому что вы не можете использовать order by с join в update подзапрос также вычисляет минимальное значение time когда workerId является NULL. limit все еще существует, только в случае, если существует более одной строки с таким же минимальным временем.

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