返回子项的查询以及带子项的父项

时间:2018-03-17 15:39:27

标签: mysql sql

我有一个包含文章的表格。有些文章是父文章的一部分。

这是我的模特:

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个查询?

3 个答案:

答案 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 |
+------------+