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

Vin*_*Vin 5 sql

我想从以下数据库表'article'中获取一些数据. 在此输入图像描述

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

例如:
'article1'的父级为'Sub Category1',其父级为'Main Category'.所以结果应该是表中的1,2,4行.

是否可以为此编写一个SQL查询?什么是可以根据上述条件获取数据的查询?

请指导我.. !!

谢谢..

Pra*_*eep 4

请参考这篇文章:管理MySQL中的分层数据

实际上,他们有目的的模型来获取分层数据而无需递归。因为他们使用 lft(left) 和 rgt(right) 这是额外的列来存储表的结构信息。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;
Run Code Online (Sandbox Code Playgroud)

对于删除任何行:

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;
Run Code Online (Sandbox Code Playgroud)

插入任意行:

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;
Run Code Online (Sandbox Code Playgroud)

这个有点复杂,但是创建存储过程后,使用起来就不难了。