我创建了一个选择查询,它显示了我需要更新的正确行:
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中查找并找到最后一条消息。这就是我的选择查询所做的,然后如果最后日期已经超过 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 子句不等于 null,它就会起作用。
最佳答案
你的第一个查询,我不喜欢它,因为我真的不明白你为什么使用 subSelect,为什么使用 group by。约会时你想要什么?
无论如何,你说过你只想要 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,请告诉我。
现在要更新,您只需加入:
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`=?
关于php - 使用子查询的 MySQL UPDATE 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39833528/