这个问题的SQL查询是什么?

这个问题的SQL查询是什么?,sql,Sql,我想从下面的数据库表“article”中获取一些数据。 我想获取其类别id为4的文章信息。但是结果应该包含其父类别的所有记录 例如: “Article 1”具有父“子类别1”,其父类别为“主类别”。因此,结果应该是表中的第1、2、4行 是否可以为此编写一个SQL查询?根据上述条件可以获取数据的查询是什么 请引导我 谢谢。请参阅本文: 实际上,他们已经设计了一个模型来获取层次数据,而无需递归。 因为他们使用lft(左)和rgt(右)将该列添加到额外的列中,以存储表的结构信息。lft和rgt设置如

我想从下面的数据库表“article”中获取一些数据。

我想获取其类别id为4的文章信息。但是结果应该包含其父类别的所有记录

例如:
“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”,层次结构的最大级别可能是未知的。