假定下表记录:
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