считать пользователя вложенного дерева - PullRequest
2 голосов
/ 27 июля 2011
id  left_User_ID  right_User_ID  referral_Id
--  ------------  -------------  -----------
1   2             5              1
2   3             4              1
3   null          null           2

enter image description here

Я хочу указать, сколько членов находится под пользователем 1. Для этого я создаю функцию, которая считает только левую сторону.

, поэтому она выглядит следующим образом:1-> 2-> 3.так это подсчет 2. То же самое сделано для вычисления правой стороны.

, так что делать для вычисления всех сторон означает левую и правую

Ответы [ 3 ]

0 голосов
/ 27 июля 2011
SELECT
   Sum(
   CASE WHEN left_user_ID is null THEN 0 ELSE 1 END +
   CASE WHEN right_user_ID is null THEN 0 ELSE 1 END
   )
FROM
   Table
WHERE
   referral_Id = 1
0 голосов
/ 29 июля 2011

это рекурсия ... и рекурсия возможна только с cte в sql.Я использовал MS SQL Server 2005.я пробую это для подсчета левого бокового узла. ЗДЕСЬ МОЕ ИМЯ ТАБЛИЦЫ НОЖЬ

  1. создать функцию left_legs (@id int)
  2. ВОЗВРАЩАЕТСЯ varchar (4) AS BEGIN
  3. ОБЪЯВИТЬ @count int set @ count = 0 WHILE @id! = 0
  4. BEGIN
  5. set @ id = cast ((ВЫБЕРИТЕ left_user_Id из Leg, где id = @ id) как varchar (4))
  6. IF @id! = 0
  7. НАЧАТЬ
  8. set @count = @ count + '1'
  9. END
  10. END
  11. RETURN @count
  12. END
    Эта функция подсчитывает общее количество левых узлов.только в одном направлении.
0 голосов
/ 27 июля 2011

Без более конкретного определения проблемы трудно оказать хорошую помощь.Тем не менее, кажется, что вы на полпути, если вы можете сосчитать левые записи.

Вместо того, чтобы считать левые записи, попробуйте подсчитать обе стороны.Psuedo-код для этого выглядит примерно так:

public static int leafCount(Node node) {
   if (node == null) {
       return 0;
   }

   return 1 + leafCount(node.left) + leafCount(node.right);
}

Если какой-либо используемый вами язык бэкэнда имеет библиотеку для древовидной структуры, я бы ожидал, что подобная функция уже предусмотрена.

РЕДАКТИРОВАТЬ:

После выявления, что у нас действительно есть древовидная структура таблицы, с возможностью запроса в SQL -

Таблица:

CREATE TABLE RECURSE (ID INT NOT NULL WITH DEFAULT, 
                      R_SIDE INT NOT NULL WITH DEFAULT, 
                      L_SIDE INT NOT NULL WITH DEFAULT)   

Данные:

INSERT INTO RECURSE VALUES (1, 2, 5)
                           (2, 3, 4)
                           (3, 0, 0)
                           (4, 0, 0)
                           (5, 0, 0)

Результирующая настройка:

Id    R_Side    L_Side
 1    2         5
 2    3         4
 3    0         0
 4    0         0
 5    0         0

Этот оператор должен возвращать количество левого и правого узлов.По крайней мере, в DB2 кажется, что существуют ограничения, которые затрудняют использование left join внутри рекурсивных CTE, поэтому вам приходится считать левую и правую стороны отдельно.Используйте это как отправную точку, если это не совсем соответствует вашим потребностям.

WITH left_side (id, count) as (SELECT id, 0
                               FROM recurse
                               WHERE L_Side = 0
                               UNION ALL
                               SELECT a.id, 1 + b.count
                               FROM recurse as a
                               JOIN left_side as b
                               ON b.id = a.l_side
                               where a.l_side > 0),

     right_side (id, count) as (SELECT id, 0
                                FROM recurse
                                WHERE R_Side = 0
                                UNION ALL
                                SELECT a.id, 1 + b.count
                                FROM recurse as a
                                JOIN right_side as b
                                ON b.id = a.R_Side
                                where a.l_side > 0)

SELECT a.id, COALESCE(b.count, 0) + COALESCE(c.count, 0) as LeafCount
FROM recurse as a
LEFT JOIN right_side as b
ON b.id = a.id
LEFT JOIN left_side as c
ON clid = a.id

Выход:

Id     LeafCount
 1     3
 2     2
 3     0
 4     0
 5     0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...