我有一个包含文章的表格。有些文章是父文章的一部分。
这是我的模特:
article_id | parent_article_id | title
--------------------------------------
61 | 0 | ...
62 | 61 | ...
43 | 61 | ...
48 | 61 | ...
示例1:
如果我选择一篇父文章(让我们说article_id
61),我想返回article_id
62,43和48.换句话说,找到所有的儿童文章。
我能够创建一个成功的查询:
SELECT a.article_id, a.title
FROM article a
WHERE a.parent_article_id = 61
示例2:
这是我被困的地方:
我有点想要反过来。例如,如果我选择一篇儿童文章(让我们说article_id
43),我想返回article_id
61,62,48。换句话说,如果我选择一篇儿童文章,则返回父文章第(61)条和所有儿童(62,48)。我不需要让孩子归还article_id
43 ..
如何为这两个示例创建1个查询?
答案 0 :(得分:0)
您可以这样做:
select a.article_id, a.title
from article a
where a.parent_article_id = (select a2.parent_article_id
from article a2
where a2.article_id = 43
) or
a.article_id = (select a2.parent_article_id
from article a2
where a2.article_id = 43
);
或者,如果您愿意:
select a.*
from article a join
article a43
on a43.article_id = 43 and
a43.parent_article_id in (a.parent_article_id, a.article_id);
使用正确的索引,第一个版本的性能可能会更好。
答案 1 :(得分:0)
听起来你的要求是寻找父母,兄弟姐妹和孩子。 对于项目61(示例1),没有父项,因此没有兄弟姐妹。因此,您只在寻找孩子。 对于项目43(示例2),有父母和兄弟姐妹。第43项没有孩子。以下内容是根据Gordon Linoff的解决方案进行修改的(以第43项为例)。它也适用于第61项。
select a.article_id, a.title
from article a
where
a.article_id = (select a2.parent_article_id
from article a2
where a2.article_id = 43
) -- find parents
or
(a.parent_article_id = (select a2.parent_article_id
from article a2
where a2.article_id = 43)
and a.article_id <> 43 ) -- find siblings
or
a.parent_article_id = 43 -- find children
答案 2 :(得分:0)
如果要返回给定文章的父文章和父文章的所有子项(给定文章除外),则以下查询将起作用:
select article_id
from article
where (
parent_article_id =
(select parent_article_id from article where article_id = 43)
or article_id =
(select parent_article_id from article where article_id = 43)
)
and article_id != 43;
输出结果如下:
+------------+
| article_id |
+------------+
| 61 |
| 62 |
| 48 |
+------------+