问题

有2个表DEALS和DEAL_DETAILS。

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

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

我已经将需要重点关注的列进行了抽象,并附加了以下架构。

我需要实现的是-

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

举一个例子-

DEALS表中1013的状态应为“已完成”。由于DEAL_DETAILS中1013已链接(外键)dealid的所有状态均为“已完成”状态。

而1012则不是这样,因为2处于“已完成”状态,而其他2则具有不同的状态。因此,不应更改DEALS表中的状态。

而且,1011毫无疑问!

我的架构看起来像这样-

交易:

php - MYSQL:当满足子查询的所有条件时,UPDATE查询中的SET值-LMLPHP

DEAL_DETAILS:

php - MYSQL:当满足子查询的所有条件时,UPDATE查询中的SET值-LMLPHP

我确实通过引用thisthisthisthis尝试了一些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表中始终有行,如果没有行,则将标记为已批准交易。

10-05 19:28