尝试更新与同一个表中的多个其他行相关的表

时间:2014-07-31 14:55:19

标签: mysql sql mariadb

我有一个表,它使用具有典型左右列(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'。

有没有办法解决这个问题?

2 个答案:

答案 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语句的源。