2016-10-03 2 views
0

Я создал запрос на выборку, который показывает мне правильные линии, что мне нужно обновить:MySQL UPDATE запрос с подзапросом

SELECT `subject`,`ticket_messages`.`ticket_ID` as t, 
(SELECT `date` from `ticket_messages` where `ticket_ID`=t ORDER BY `date` DESC LIMIT 1) as d 
from `ticket_messages` 
LEFT JOIN `tickets` on `ticket_messages`.`ticket_ID`=`tickets`.`ticket_ID` 
GROUP BY t 
HAVING d<date_sub(curdate(), interval 5 day) 
ORDER BY t 

Я буду использовать PHP, но разработка запроса первый в PHPMyAdmin справа выше запрос работает и дает мне правильные строки. В основном это список чего-либо более 5 дней. Не беспокойтесь, что я выбираю тему и дату, это было только так, что я знал, что получаю правильные строки.

Вопрос в том, как мне превратить это в запрос на обновление? Мне потребовалось несколько часов, чтобы это уже работало.

Что я буду обновлять это:

UPDATE `tickets` SET `status`=? 

В основном это будет смотреть в ticket_messages и найти последнее сообщение. Это то, что делает мой запрос select, а затем он обновит в моей таблице «билеты» статус, если последняя дата превышает 5 дней. Таблицы связаны по ссылке.

Так что мне нужно обновить с помощью подзапроса, и я не имею понятия об этом.

Хорошо, добавьте немного больше. Я пробовал это

UPDATE `tickets` SET `status`=8 
WHERE 
(
SELECT `subject`,`ticket_messages`.`ticket_ID` as t, 
(SELECT `date` from `ticket_messages` where `ticket_ID`=t ORDER BY `date` DESC LIMIT 1) as d 
from `ticket_messages` 
LEFT JOIN `tickets` on `ticket_messages`.`ticket_ID`=`tickets`.`ticket_ID` 
GROUP BY t 
HAVING d<date_sub(curdate(), interval 5 day) 
ORDER BY t)!=null 

Я думал, что предложение where будет работать, если оно не равно нулю.

+0

См http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for- что-кажется-to-me-to-be-a-very-simple-sql-query – Strawberry

+0

Я просмотрел эту страницу и даже не знаю, о чем она говорит. Даже не уверен в том, что MCVE не выпускает. –

+0

Взгляд - это не то же самое, что чтение. Попробуйте прочитать. – Strawberry

ответ

1

Ваш первый запрос, мне это не нравится, потому что я действительно не понимаю, почему вы используете subSelect, почему вы используете группу. Что вы хотите на эту дату?

В любом случае вы сказали, что вы хотите только билеты старше 5 дней,

SELECT tm.ticket_ID, MAX(`date`) as d 
FROM `ticket_messages` as tm 
GROUP BY tm.ticket_ID 
HAVING d < date_sub(curdate(), interval 5 day) 

И это все для вас первый запрос. Скажите, если вы получите тот же ID.

Теперь для обновления, вы просто должны JOIN:

UPDATE `tickets` 
INNER JOIN 
(SELECT tm.ticket_ID, MAX(`date`) as d 
    FROM `ticket_messages` as tm 
    GROUP BY tm.ticket_ID 
    HAVING d < date_sub(curdate(), interval 5 day)) AS T 
ON T.ticket_ID = `tickets`.ticket_ID 
SET`status`=? 
+0

. Я объясню. Потребность в подзапросе билета такова. В 'ticket_messages' будет несколько идентификаторов, так как вы можете иметь несколько билетов на один идентификатор. Подзапрос дает мне дату последнего билета для идентификатора. Таким образом, подзапрос важен. Я не могу просто использовать «дату», поскольку мне нужна последняя дата. Группа важна, так как в противном случае у меня было бы несколько строк билета. Мне нужна только последняя строка каждого билета. –

+0

ok вам не нужен ваш подзапрос. Я отредактирую свой ответ –

+0

Pls проверит мой запрос и скажет, работает ли он. –

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