php - MYSQL : SET value in an UPDATE query when all conditions of subquery are satisfied

标签 php mysql sql performance query-optimization

问题

有 2 个表 DEALS 和 DEAL_DETAILS。

DEALS 表包含有关交易的标题和其他一般信息。

DEAL_DETAILS 表包含有关必须显示交易的不同时间范围、特定于交易的地址等的信息,

我已经抽象出了我们需要关注的列,并附上了下面的架构。

我需要实现的是-

DEAL_DETAILS中特定交易所有状态-es“已完成”时,我想将 DEALS 表中的状态更新为“已完成”。

举个例子-

DEALS 表中 1013状态应为“已完成”。由于DEAL_DETAILS1013链接(外键)已成交所有状态为处于“已完成”状态。

1012 的情况并非如此,因为有 2 个处于“已完成”状态,而其他 2 个具有不同的状态。因此,DEALS 表中的状态不应更改。

而且,1011 是不可能的!

我的架构如下所示-

优惠:

enter image description here

DEAL_DETAILS:

enter image description here

我确实通过引用this尝试了一些SQL查询, this , thisthis 。我的查询不完整并且看起来不太好。 目前,我已经使用 PHP 实现了相同的低效(我猜)(请忽略列名是否有更改)。

while ($row = mysqli_fetch_assoc($aggregateStatusresult)) {
    //$return_array[$i++] = $row;
    if(strcmp($row->status, 'completed') && (!(isset($statusarray[$row->dealid])) || ($statusarray[$row->dealid] != 'completed')))
        $statusarray[$row->dealid] = 'completed';
    else
        $statusarray[$row->dealid] = $row->status;
}
foreach($statusarray  as $dealid => $status){
    $updateAggregateStatus = "update deals d set d.status='".$status."' where d.dealid = '".$dealid."'";
    $updateAggregateStatusresult = $connection->query($updateAggregateStatus);
}

最佳答案

您应该能够通过简单的NOT EXISTS检查来处理它:

UPDATE deals d SET d.status='approved'
  WHERE NOT EXISTS (SELECT * FROM deal_details
    WHERE deal_details.dealid = d.id AND status <> 'completed');

这假设 deal_details 表中始终有行,如果没有行,则会将交易标记为已批准。

关于php - MYSQL : SET value in an UPDATE query when all conditions of subquery are satisfied,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37755794/

相关文章:

从 Shoutcast/Icecast 流中提取艺术家和标题的 PHP 脚本

android - 向服务器发送数据时出现NullPointerException和数据重复

mysql - 在不破坏连接的情况下使用池会使系统挂起

python - MySQLdb 错误 : 'Unknown Database Python' using MySQL Workbench

sql - 在本地运行 Azure 移动服务器项目

java - 找到最近的邻居/经纬度

sql - 登录sql server时密码不匹配

php - 在共享主机中允许覆盖所有

php - 是否可以将错误处理程序添加到 header (“Location: ”。$ _ SERVER [“HTTP_REFERER”]);在PHP中

PHP - 数据库查询或 POST