我有一个表,它使用具有典型左右列(trLeft和trRight)的嵌套集来表示树。为了优化,我还在树中包含行的级别,这是它在树ROOT之前的父级数。
在嵌套集中,行A的父级是B.trLeft < A.trLeft AND B.trRight > A.trRight
的所有其他行B.
因此,计算这些行将返回该级别,从而导致以下更新查询以便更新具有正确级别的所有行:
UPDATE Groups AS g1 SET g1.trLevel = (
SELECT COUNT(*) FROM Groups AS g2 WHERE g2.trLeft < g1.trLeft AND g2.trRight > g1.trRight ) ;
但这会导致错误1093“您无法在FROM子句中为更新指定目标表'g1'。
有没有办法解决这个问题?
答案 0 :(得分:0)
一个愚蠢的解决方法是将派生表嵌套在子查询中,如下所示:
UPDATE Groups AS g1
SET g1.trLevel = (
SELECT COUNT(*)
FROM (
SELECT *
FROM Groups AS g2
) AS temp
WHERE
temp.trLeft < g1.trLeft
AND temp.trRight > g1.trRight
);
我通过首先构建表来测试这个:
CREATE TABLE Groups (trLeft int, trRight int, trLevel int);
INSERT INTO Groups (trLeft, trRight) VALUES (1, 4), (5, 6), (2, 3);
它有效。
答案 1 :(得分:0)
你必须在一个选择中嵌套计数。我认为这会奏效:
EDITED: Updated query
UPDATE Groups SET trLevel = (
SELECT * FROM
(
SELECT COUNT(*) FROM Groups g2 inner join Groups g1 on g2.unique_id = g1.unique_id WHERE g2.trLeft < g1.trLeft AND g2.trRight > g1.trRight
) AS my_count
) ;
AS my_count
很重要,因为它告诉MySQL从这个查询创建一个tmp表。然后将my_count tmp表用作UPDATE语句的源。