[英]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.