mysql父子查询限制数量_MySQL:如何查询父子?

假定下表​​记录:

TABLE: foo

==========================

| foo_id | foo_parent_id |

==========================

| 1 | NULL |

| 2 | NULL |

| 3 | 1 |

| 4 | 2 |

| 5 | 1 |

| 6 | 1 |

| 7 | 2 |

| 8 | 1 |

| 9 | NULL |

--------------------------

我想立即获得前10个父记录(那些具有foo_parent_id = NULL的记录),然后立即获取该父记录的前2个子记录.因此,我正在寻找这样的结果:

1, NULL

3, 1

5, 1

2, NULL

4, 2

7, 2

9, NULL

我如何查询这样的东西?

解决方法:

这是一个主意.但这是基于有关数据设置方式的许多假设.不断增加的ID沿树下降,只有两个级别,依此类推.

SELECT f.foo_id,f.foo_parent_id FROM foo f

foo f

-给我前X个parent_ids

(这很好,您只需调整LIMIT 10即可更改要显示的父级数)

INNER JOIN

(select foo_id from foo where foo_parent_id is null order by foo_parent_id

LIMIT 10

) top_foo_parent

on isnull(f.foo_parent_id,f.foo_id) = top_foo_parent.foo_id

WHERE

(这部分有点怪异,因为您必须把更长的字符串串起来才能超过两个孩子)

-是第一个孩子,或者…

(f.foo_id in (select MIN(foo_id) from foo fc1 where fc1.foo_parent_id =f.foo_parent_id)

)

or

-是第二个孩子,或者…

(f.foo_id in (select MIN(foo_id) from foo fc1 where fc1.foo_parent_id =f.foo_parent_id and fc1.foo_id not in (select MIN(foo_id) from foo fc2 where fc2.foo_parent_id=f.foo_parent_id))

)

or

-是父母

f.foo_parent_id is null

order by isnull(f.foo_parent_id,f.foo_id)*100 + f.foo_id

因此,我们在这里所做的基本上是按parent_id列排序,然后按其下面的子列进行排序.如果parentid列为NULL,则使用实际ID.这意味着出于订购目的,我们的表格如下所示:

==============================================================================

| foo_id | foo_parent_id | isnull(f.foo_parent_id,f.foo_id)

==============================================================================

| 1 | NULL | (1)

| 2 | NULL | (2)

| 3 | 1 | 1

| 4 | 2 | 2

| 5 | 1 | 1

| 7 | 2 | 2

----------------------------------------------------------------------

然后我们将排序列乘以* 100

==============================================================================

| foo_id | foo_parent_id | isnull(f.foo_parent_id,f.foo_id)*100

==============================================================================

| 1 | NULL | 100

| 2 | NULL | 200

| 3 | 1 | 100

| 4 | 2 | 200

| 5 | 1 | 100

| 7 | 2 | 200

----------------------------------------------------------------------

最后,我们在其中添加foo_id列

==============================================================================

| foo_id | foo_parent_id | isnull(f.foo_parent_id,f.foo_id)*100 + foo_id

==============================================================================

| 1 | NULL | 101

| 2 | NULL | 202

| 3 | 1 | 103

| 4 | 2 | 204

| 5 | 1 | 105

| 7 | 2 | 207

----------------------------------------------------------------------

现在,我们通过该虚拟列对表格进行排序,然后…

==============================================================================

| foo_id | foo_parent_id | ORDER BY isnull(f.foo_parent_id,f.foo_id)*100 + foo_id

==============================================================================

| 1 | NULL | 101

| 3 | 1 | 103

| 5 | 1 | 105

| 2 | NULL | 202

| 4 | 2 | 204

| 7 | 2 | 207

----------------------------------------------------------------------

好了!

标签:mysql,database

来源: https://codeday.me/bug/20191201/2084589.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值