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

Posted

技术标签:

【中文标题】MYSQL:当满足子查询的所有条件时,在 UPDATE 查询中设置值【英文标题】:MYSQL : SET value in an UPDATE query when all conditions of subquery are satisfied 【发布时间】:2016-06-10 19:24:46 【问题描述】:

问题

有 2 个表 DEALS 和 DEAL_DETAILS。

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

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

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

我需要实现的是-

DEAL_DETAILS 中特定 dealidALL status-es 已“完成”时,我想将 DEALS 表中的 status 更新为“已完成”。

举个例子-

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

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

而且,1011 是不可能的!

我的架构如下所示-

交易:

DEAL_DETAILS:

我确实通过引用 this、this、this 和 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);

【问题讨论】:

【参考方案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 表中始终存在行,如果没有行,它将标记交易已批准。

【讨论】:

谢谢。这很简单。我只需要对查询进行一些更改以适应非常特定的目的。

以上是关于MYSQL:当满足子查询的所有条件时,在 UPDATE 查询中设置值的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL子查询

mysql查询子查询连接查询

子查询分组后主查询怎么接收count

mysql 子句子查询连接查询

MySQL-SQL基础-子查询

Elastic Search之布尔查询