这个问题的SQL查询是什么?
我想从下面的数据库表“article”中获取一些数据。 我想获取其类别id为4的文章信息。但是结果应该包含其父类别的所有记录 例如:这个问题的SQL查询是什么?,sql,Sql,我想从下面的数据库表“article”中获取一些数据。 我想获取其类别id为4的文章信息。但是结果应该包含其父类别的所有记录 例如: “Article 1”具有父“子类别1”,其父类别为“主类别”。因此,结果应该是表中的第1、2、4行 是否可以为此编写一个SQL查询?根据上述条件可以获取数据的查询是什么 请引导我 谢谢。请参阅本文: 实际上,他们已经设计了一个模型来获取层次数据,而无需递归。 因为他们使用lft(左)和rgt(右)将该列添加到额外的列中,以存储表的结构信息。lft和rgt设置如
“Article 1”具有父“子类别1”,其父类别为“主类别”。因此,结果应该是表中的第1、2、4行 是否可以为此编写一个SQL查询?根据上述条件可以获取数据的查询是什么 请引导我
谢谢。请参阅本文: 实际上,他们已经设计了一个模型来获取层次数据,而无需递归。 因为他们使用lft(左)和rgt(右)将该列添加到额外的列中,以存储表的结构信息。lft和rgt设置如下 根lft为1。然后它的第一个子节点lft是下一个数字,然后它在下一个数字中的子节点,依此类推,直到没有子节点,那么对于该节点(叶节点),rgt将是它的lft+1。 我们将兄弟lft设置为rgt+1,并遵循相同的规则 如果所有孩子的编号都完成了,它将把父母的rgt设置为最后一个孩子的rgt+1 我没有清楚地解释它,但在与图像的链接上,它更容易理解 因此,在此之后,您可以使用以下查询轻松地探索嵌套结构 要按顺序获取所有父级id,请执行以下操作:
SELECT parent.category_id
FROM article AS node,
article AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.category_id = $category_id
ORDER BY parent.lft;
要删除任何行,请执行以下操作:
LOCK TABLE article WRITE;
SELECT @myLeft := lft, @myRight := rgt, @myWidth := rgt - lft + 1
FROM article WHERE category_id = 'row_id';
DELETE FROM article WHERE lft BETWEEN @myLeft AND @myRight;
UPDATE article SET rgt = rgt - @myWidth WHERE rgt > @myRight;
UPDATE article SET lft = lft - @myWidth WHERE lft > @myRight;
UNLOCK TABLES;
要插入任何行,请执行以下操作:
LOCK TABLE article WRITE;
SELECT @myLeft := lft FROM article WHERE category_id = 'parent_id';
UPDATE article SET rgt = rgt + 2 WHERE rgt > @myLeft;
UPDATE article SET lft = lft + 2 WHERE lft > @myLeft;
INSERT INTO article(title, lft, rgt) VALUES('title', @myLeft + 1, @myLeft + 2);
UNLOCK TABLES;
这有点复杂,但在创建存储过程后,使用起来并不困难。在MS SQL 2005/2008中:
with cte(category_id, parent_id, title)
as
(
select category_id, parent_id, title
from Category
where category_id = 4
union all
select cat.category_id, cat.parent_id, cat.title
from Category cat
join cte on
cat.category_id = cte.parent_id
)
select *
from cte
这在SQL中称为递归查询。Oracle和Postgresql使用的语法与Alex Aza的回答不同,在MySQL中,我认为您不可能在一个查询中完成这项工作
WITH RECURSIVE t(category_id, parent_id, title) AS
(SELECT category_id, parent_id, title
from Category
where category_id = 4)
UNION ALL
SELECT c.category_id, c.parent_id, c.title
FROM Category c, t WHERE t.parent_id=c.category_id /* ends when parent_id==-1 */
)
SELECT * FROM t;
递归的
是必需的。如果您使用的是SQLServer2008,请尝试hierarchyid谢谢分享。。本文给出了4级层次结构的查询。在这里,对于不同的“类别id”,层次结构的最大级别可能是未知的。