我有以下SQL用于获取树节点及其父节点:
SELECT
c.id
, c.tag
, (
SELECT
s.id
FROM treeTable s
WHERE s.lft < c.lft AND s.rgt > c.rgt
ORDER BY s.rgt - c.rgt ASC
LIMIT 1
) AS parent
FROM treeTable c;
问题是我在表格中也需要s.tag
,但是我不能从子查询中选择两列。我怎样才能重构这个SQL以便能够选择两列?
我已经看过很多关于可能尝试LEFT JOIN的资源,但却找不到任何工作。由于需要在子查询中使用ORDER BY和LIMIT,我无法想到一个简单的分组操作
编辑:表的结构如下:
Field Type Collation Null Key Default Extra Privileges Comment
-------- ---------------- ----------------- ------ ------ ------- -------------- ------------------------------- ---------
id int(10) (NULL) NO PRI (NULL) auto_increment select,insert,update,references
tag varchar(255) latin1_swedish_ci NO (NULL) select,insert,update,references
lft int(11) (NULL) NO MUL (NULL) select,insert,update,references
rgt int(11) (NULL) NO MUL (NULL) select,insert,update,references
答案 0 :(得分:0)
尝试使用两个低效的子选择
SELECT
c.id,
c.tag,
(
SELECT
s.id
FROM treeTable s
WHERE s.lft < c.lft AND s.rgt > c.rgt
ORDER BY s.rgt - c.rgt ASC
LIMIT 1
) AS parent,
(
SELECT
s.tag
FROM treeTable s
WHERE s.lft < c.lft AND s.rgt > c.rgt
ORDER BY s.rgt - c.rgt ASC
LIMIT 1
) AS parent_tag
FROM treeTable c;
这似乎在逻辑上是正确的。不能测试它对不起。在这种情况下,如果你真的经常使用它,你应该重新设计和设计一个具有更好定义的父子链接的表