MYSQL:满足子查询的所有条件时UPDATE查询中的SET值

时间:2016-06-10 19:24:47

标签: php mysql sql performance query-optimization

问题

有2个表DEALS和DEAL_DETAILS。

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

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

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

我需要实现的是 -

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

举个例子 -

DEALS 表中 1013 状态应为“已完成”。 DEAL_DETAILS 中的所有 状态 es 1013 已关联(外键) dealid 处于“已完成”状态。

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

而且,1011是不可能的!

我的架构看起来像这样 -

美国:

enter image description here

DEAL_DETAILS:

enter image description here

我参考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);
}

1 个答案:

答案 0 :(得分:1)

您应该可以通过简单的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表中始终存在行,如果没有,则会标记已批准的交易。