php - 使用子查询的 MySQL UPDATE 查询

标签 php mysql

我创建了一个选择查询,它显示了我需要更新的正确行:

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/

相关文章:

mysql - 嵌套查询未在 MariaDB 中使用 nodeJS 调用

mysql - 获取每个人每天的最短日期时间的记录

php - 你如何处理 PHP 中的时差计算?

php - 自定义 URL/域(CNAME 别名?)

php - OctoberCMS 不创建索引

PHP Include 不使用 bootstrap 下拉菜单

php - 阻止用户在其用户名中注册空格

php - 从当前函数中取消设置所有已定义的变量

MySQL 数据库复制不起作用 - 显示 processlist 数据库为空

php - 插入数组并在 PhpMyAdmin 中显示值