我有一张 table :
CREATE TABLE `users` (
`user_id` int(10) NOT NULL,
`user_name` char(150) NOT NULL,
`parent_id` int(10) NOT NULL,
`leg` enum('l','r') NOT NULL,
`status` enum('unactive','active','block') NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
parent_id
是用户加入的id
leg 是用户加入的位置 l=left r=right。
示例:
它的两条腿二进制。 我想计算顶级用户左侧的所有用户。如图所示 2 级用户使用 1 级用户 ID 作为父 ID。
请帮助我
最佳答案
乍一看,这似乎是一个需要用递归来解决的问题;但只要对数据库模式进行一些更改,就可以通过单个查询来完成。就数据库查询而言,它不是最有效的方法,但它仍然优于递归。
这个答案的基础来自 ruby on rails gem
这个想法是使用 ancestry
字段而不是 parent_id
。祖先字段包含对所有记录的父项的引用。因此对于以下树:
1
2 3
4 5 6 7
8 9 10 11 12 13 14 15
“祖先”字段如下所示:
Id Ancestry
--------------
1 null or ''
2 '1L'
3 '1R'
4 '2L 1L'
5 '2R 1L'
6 '3L 1R'
7 '3R 1R'
8 '4L 2L 1L'
9 '4R 2L 1L'
10 '5L 2R 1L'
11 '5R 2R 1L'
12 '6L 3L 1R'
13 '6R 3L 1R'
14 '7L 3R 1R'
15 '7R 3R 1R'
现在,获取 ID 1 左侧的计数和/或所有子项很简单:
从祖先像“%1L%”的用户中选择 COUNT(id) AS child_count
从祖先像“%1L%”的用户中选择*
获取 ID 2 左侧的用户:
从祖先像“%2L%”的用户中选择*
想要 ID 1 右边的 child 吗?
从祖先像“%1R%”的用户中选择*
编辑
刚刚意识到,一旦ancestry
数字达到两位数,模糊之类就会得到一些不好的结果。为了解决这个问题,请在每个祖先前面使用一些分隔符,即
Id Ancestry
--------------
1 null or ''
2 '_1L'
3 '_1R'
4 '_2L_1L'
5 '_2R_1L'
6 '_3L_1R'
7 '_3R_1R'
8 '_4L_2L_1L'
9 '_4R_2L_1L'
10 '_5L_2R_1L'
11 '_5R_2R_1L'
12 '_6L_3L_1R'
13 '_6R_3L_1R'
14 '_7L_3R_1R'
15 '_7R_3R_1R'
然后在查询中包含该分隔符:
从祖先类似“%_1L%”的用户中选择 COUNT(id)
关于php - 计算二进制 PHP MYSQL 中的左用户数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45394634/