php - 计算二进制 PHP MYSQL 中的左用户数

标签 php mysql mysqli mysqli-multi-query

我有一张 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。

示例:

enter image description here

它的两条腿二进制。 我想计算顶级用户左侧的所有用户。如图所示 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/

相关文章:

java - 选择查询很慢

php - 我可以在 PHP 中混合使用 MySQL API 吗?

php - 加载不同的数据库 Symfony2

php - 如何将表单数据添加到 JSON 文件?

PHP 获取 MySQL 列

mysql - CakePHP-2.0:重构我的代码编辑更快的sql查询,需要更快的sql查询

带有内部连接的 2 个表的 mysql 查询

php - Facebook 应用程序开发 : Are there Tutorials, 以架构为中心的截屏视频等

php - 如何比较多个表中列名相同的列值?

php - 在MySql数据库中按相等值统计记录数