MYSQL : 当子查询的所有条件都满足时,在 UPDATE 查询中设置值

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

问题

有 2 table 笔交易和 DEAL_DETAILS。

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

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

我已经提取了我们需要关注的列并附上了下面的架构。

我需要实现的是-

When ALL status-es of a particular dealid in DEAL_DETAILS 是 'completed' 我想在 DEALS table 中更新 状态作为 'completed'.

举个例子-

1013DEALS table 中的 status 应该是 'completed'。作为 ALL statuses of 1013 linked(Foreign Key) dealidDEAL_DETAILS 中处于 'completed' 状态。

然而,1012 情况并非如此,因为 2 个在 'completed' status 中,其他 2 个具有不同的 状态。因此,DEALS table 中的 status 不应更改。

而且,1011也不行!

我的模式是这样的-

交易:

DEAL_DETAILS:

我确实通过参考 this, this, this and this 尝试了一些 SQL 查询。我的查询不完整,看起来不太好。 目前,我已经使用 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 table 中始终有行,如果有 none 它将标记交易已批准。