这就是我想做的事情,但MySQL似乎并不接受它。
SELECT Name, Content, Lft, Rht FROM Articles WHERE
(Lft > (SELECT Lft FROM Articles WHERE idArticle = 1))
AND WHERE
(Rht < (SELECT Rht FROM Articles WHERE idArticle = 1));
我正在实施modified preorder tree transversal 算法,我希望使用单个数据库查询来获取Article
的所有子项。
文章表格如下:
Articles +=============+===========+ | Type | Name | +=============+===========+ | VARCHAR(45) | Name | +-------------+-----------+ | LONGTEXT | Content | +-------------+-----------+ | INT | Lft | +-------------+-----------+ | INT | Rht | +-------------+-----------+ | INT | idArticle | +-------------+-----------+
idArticle
是主键,Lft
和Rht
列上有唯一索引。
这样的事情怎么可能完成?
*注意:我当前正在使用MySQL,但我希望尽可能避免任何MySQL扩展,因为有可能计划在将来某个时候迁移到Postgres或Oracle等其他数据库...
答案 0 :(得分:4)
它没有被接受,因为WHERE关键字只能在查询中出现一次(在子查询之外):
SELECT x.name,
x.content,
x.lft,
x.rht
FROM ARTICLES x
WHERE EXISTS(SELECT NULL
FROM ARTICLES y
WHERE y.idarticle = 1
AND y.lft < x.lft)
AND EXISTS(SELECT NULL
FROM ARTICLES z
WHERE z.idarticle = 1
AND z.rht > x.rht)
答案 1 :(得分:2)
显然这只是一个简单的语法错误(WHERE太多),但是如果你想避免使用标量子选择,你也可以进行连接(具有idArticle 1的行只需要加载一次的潜在优势) ,您的查询计划程序可能或可能无法自行解决的优化:
SELECT a.Name, a.Content, a.Lft, a.Rht FROM Articles a
join Articles b on (b.idArticle =1 )
where a.lft > b.lft and a.rht < b.rht;
SELECT a.Name, a.Content, a.Lft, a.Rht
FROM Articles a
join Articles b on a.lft > b.lft
and a.rht < b.rht
AND b.idArticle = 1 ;