【问题标题】:MySQL using select statement in update sets nullMySQL 在更新集中使用 select 语句 null
【发布时间】:2018-06-18 06:33:53
【问题描述】:

我正在尝试按照我描述的方式更新一棵树。我有一棵深度为 5 的树,叶节点的值大于 0。现在对于每个父节点,我想计算子节点中访问次数最多的值并为自己设置该值。现在我正在尝试这样做:

update itmanagement.PRC_processes parent
set MainStructID = (case when (select MainStructID
from (select * from itmanagement.PRC_processes) child
where parent.ProcessID = child.ParentID
group by MainStructID
order by count(*)
limit 1) is null then 0 else (select MainStructID
from (select * from itmanagement.PRC_processes) child
where parent.ProcessID = child.ParentID
group by MainStructID
order by count(*)
limit 1) end),
SubStructID = (case when (select SubStructID
from (select * from itmanagement.PRC_processes) child
where parent.ProcessID = child.ParentID
group by SubStructID
order by count(*)
limit 1) is null then 0 else (select SubStructID
from (select * from itmanagement.PRC_processes) child
where parent.ProcessID = child.ParentID
group by SubStructID
order by count(*)
limit 1) end)
where ProcessID > 0 and MainStructID = 0 and SubStructID = 0;

但运行上述查询后,没有任何变化。例如,ID 为 ProcessID = 24 的行保留之前的值 0。但下面的查询返回值:

select SubStructID
from (select * from itmanagement.PRC_processes) child
where child.ParentID = 24
group by SubStructID
order by count(*)
limit 1;

我自己的猜测是 select 语句返回一个表(也只有一行),它在赋值中不起作用。

那么问题是什么以及如何解决呢?

【问题讨论】:

  • 您需要添加一些示例数据和表格描述,例如作为一个 sql 小提琴。最可能的问题:MainStructIDSubStructId 的当前值是否真的都是 0 或者可能(至少其中之一)null(在这种情况下,您的查询将不会因为 where 条件而更新)?此外,您可能需要order by count(*) desc 而不是order by count(*)。不相关:您可以使用set MainStructID = coalesce(...,0) 而不是set MainStructID = case when ... is null then 0 else ... end(但它不会影响您的问题,只会使您的代码更短)。

标签: mysql select nested sql-update


【解决方案1】:

我终于将查询更改为以其他方式工作。 而且我还利用了@Solarflare 的答案来提高效率。

现在查询如下所示。我希望它可以帮助其他人:

update itmanagement.PRC_processes parent
join (select child.ParentID ParentID
, (select MainStructID from itmanagement.PRC_processes childer where childer.ParentID = child.ParentID group by MainStructID order by count(*) desc LIMIT 1) maxSeenMainStructID
, (select SubStructID from itmanagement.PRC_processes childer where childer.ParentID = child.ParentID group by SubStructID order by count(*) desc LIMIT 1) maxSeenSubStructID
from itmanagement.PRC_processes child
where child.ParentID is not null
group by child.ParentID) calcProcesses on parent.ProcessID = calcProcesses.ParentID
set parent.MainStructID = coalesce(calcProcesses.maxSeenMainStructID, 0)
,parent.SubStructID = coalesce(calcProcesses.maxSeenSubStructID, 0)
where parent.ProcessID > 0 and parent.MainStructID = 0 and parent.SubStructID = 0;

现在一切都很顺利。

【讨论】:

  • (旁白:欢迎您通过单击对勾来“自行接受”此答案,表示已解决。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-17
  • 1970-01-01
  • 2018-07-29
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多