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'.
举个例子-
1013 在 DEALS table 中的 status 应该是 'completed'。作为 ALL statuses of 1013 linked(Foreign Key) dealid 在 DEAL_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 它将标记交易已批准。
问题
有 2 table 笔交易和 DEAL_DETAILS。
DEALS table 包含有关交易的标题和其他一般信息。
DEAL_DETAILS table 包含有关必须显示交易的不同时间范围、特定于交易的地址等信息,
我已经提取了我们需要关注的列并附上了下面的架构。
我需要实现的是-
When ALL status-es of a particular dealid in DEAL_DETAILS 是 'completed' 我想在 DEALS table 中更新 状态作为 'completed'.
举个例子-
1013 在 DEALS table 中的 status 应该是 'completed'。作为 ALL statuses of 1013 linked(Foreign Key) dealid 在 DEAL_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 它将标记交易已批准。