簡體   English   中英

計算二進制PHP MYSQL中的剩余用戶

[英]Count Left users in binary PHP MYSQL

我有一張桌子:

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,其中用戶聯接腿是用戶parent_id的位置l = left r = right。

例:

在此處輸入圖片說明

它的兩腿二進制。 我想計算所有在最高用戶左側的用戶。 與圖像2級用戶一樣,使用1級用戶ID作為父級ID。

請幫我

首先,這看起來像是要遞歸解決的問題; 但是只要對數據庫架構進行一些更改,就可以通過單個查詢完成。 就數據庫查詢而言,這並不是最有效的方法,但它仍然勝過遞歸。

此答案的依據來自於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%'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM