【问题标题】:MySQL Selecting hierarchy with unionMySQL使用联合选择层次结构
【发布时间】:2018-05-08 16:58:52
【问题描述】:

我有这样的层次结构数据:

Id, Related
1, 0
2, 1
3, 1
4, 1
5, 4
6, 3
7, 0
8, 7
9, 3
10, 8

我想选择 2 个父母,然后为每个父母找到 2 个孩子

结果:

id
1
  2
  3
7
  8

类似:

select * from TABLE T1 where T1.related=0 order by T2.id limit 2 
union 
select * from TABLE T2 where T1.id=T2.related order by T2.id limit 2

我一直在研究 mysql 选择分层数据,但找不到任何可以帮助解决我的情况的东西。

【问题讨论】:

    标签: mysql sql hierarchy


    【解决方案1】:

    您想选择所有带有Related = 0 的记录。然后你想选择最多两个随机孩子。一种解决方案是采用最小子 ID 和最大子 ID。您可以在子查询中查找父母。

    select
      related as parent_id, 
      min(id) as child1_id,
      max(id) as child2_id
    from mytable
    where related in (select id from mytable where related = 0)
    group by related;
    

    如果您不想显示相同的孩子 ID 两次(如果只有一个孩子,即 min(id) = max(id)),请将其更改为:

    select
      related as parent_id, 
      min(id) as child1_id,
      nullif(max(id), min(id)) as child2_id
    ...
    

    这些查询不会显示没有孩子的 related = 0 记录,但是,如果没有孩子,他们无论如何都不是父母 :-)

    【讨论】:

    • 很有趣,但我想保持灵活。我希望第 1 行成为父母,第 2 行和第 3 行如果存在则成为其孩子,下一行成为另一个父母(如果存在),以及另外两个孩子。但我希望将来能够将其更改为更多的孩子。
    • 这通常通过递归查询来解决。自 MySQL 8.0 起可用。对于较低版本的 MySQL,我会避免在 SQL 中执行此操作,而是使用编程语言在应用程序或网站中执行此操作。
    • 由于您只对树的前两层感兴趣,因此无需递归查询就可以实现。可能与 MySQL 变量有关。
    【解决方案2】:

    试试这个。我在 MSSQl 中测试它。我希望它也可以在 mysql 中工作

    SELECT id,child FROM
    (SELECT t1.Related id,t1.id child,row_number() over (partition by t1.Related ORDER BY t1.Id) sl FROM Table1 t1
    INNER JOIN Table1 t2 ON t1.Related=t2.Id) t
    where t.sl<=2
    

    SET @row_number:=0;
    SET @Related:=0;
    SET @Child:=0;
    SELECT t.id,t.Child FROM 
    (SELECT @row_number:=CASE WHEN @Related=t1.Related THEN @row_number+1 ELSE 1 END AS row_nu, @Related:=t1.Related AS id,@Child:=t1.id AS Child
    FROM Table1 t1
    INNER JOIN Table1 t2 ON t1.Related=t2.Id) t
    WHERE t.row_nu<=2;
    

    DB Fiddle upadte DB Fiddle

    【讨论】:

    • 我不相信这将在 MySQL
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多