【问题标题】:Count Left users in binary PHP MYSQL在二进制 PHP MYSQL 中计算左用户
【发布时间】:2018-01-05 18:30:41
【问题描述】:

我有一张桌子:

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。

请帮帮我

【问题讨论】:

  • 我不认为这可以通过单个查询来解决,但我认为使用递归函数相对容易。到目前为止,您尝试过什么?
  • 请在文本中使用标点符号(逗号、句号、大写等...)。你的文章很难理解(至少对我来说)。

标签: php mysql mysqli mysqli-multi-query


【解决方案1】:

起初,这看起来像是一个用递归解决的问题;但是通过对数据库架构进行一些更改,可以通过单个查询来完成。就数据库查询而言,它不是最有效的方法,但它仍然胜过递归。

这个答案的依据来自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 左侧的计数和/或所有孩子很简单:

SELECT COUNT(id) AS child_count FROM users WHERE ancestry LIKE '%1L%'

SELECT * FROM users WHERE ancestry LIKE '%1L%'

获取 ID 2 左侧的用户:

SELECT * FROM users WHERE ancestry LIKE '%2L%'

想要 ID 1 右边的孩子吗?

SELECT * FROM users WHERE ancestry LIKE '%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'

然后在查询中包含该分隔符:

SELECT COUNT(id) FROM users WHERE ancestry LIKE '%_1L%'

【讨论】:

  • 比这更干净的是Nested Set Model,其中每个节点都有一个左右 ID,而我后代的 ID 总是在我的之间......我最初认为这是你要去的地方回答。嵌套集允许简单的整数范围查询来解析给定节点以下的任意深度。
  • 感谢我在您的表格结构方面得到了很大帮助。我的计数问题已经完全解决了。你能告诉我用developers.google.com/chart/interactive/docs/gallery/orgchart这个结构显示树吗
  • 我对 orgchart 没有任何经验,但看起来您只需使用 php 来遍历 data.addRows([,以便 javascript 可以构建图表。对不起,我不能帮你。如果我对这篇文章的回答对您有所帮助,请考虑相应地标记答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-05
  • 1970-01-01
相关资源
最近更新 更多