Я добавляю еще людей, чтобы было ясно, я понимаю, что вам нужно:
userid | name | subof
1 | John | 0
2 | Joe | 1
3 | Jill | 0
4 | Janet | 2
5 | Dawn | 4
6 | James | 4
7 | Mary | 3
8 | Doug | 6
Так скажи, твой босс просит людей под Джо.
Вы хотите получить: Джанет, Дон, Джеймс, Даг - верно?
Вместо добавления нового столбца, как насчет изменения определения subof (в моем примере я сделал это varchar)?
Итак, ваш стол будет выглядеть так:
userid name subof
1 John 0
2 Joe 0.1
3 Jill 0
4 Janet 0.1.2
5 Dawn 0.1.2.4
6 James 0.1.2.4
7 Mary 0.3
8 Doug 0.1.2.4.6
Вершина пирамиды равна 0, поэтому Джон и Джилл все еще наверху. Тогда вы знаете, кто находится под каждым из последовательностей, следующих за 0.
- изменил john и jill на 0 вместо 0.0, чтобы упростить обновления
Делая так, вы можете получить нужные вам результаты в следующем запросе:
select * from temporary WHERE subof like '0.1.2%' ORDER BY userid ASC;
//this is joe's subof +'.'+ his userid
Итак, ваш следующий вопрос - как вставить нового новобранца. ХОРОШО. Билл приходит под Дуга. Так что же будет за вставка для Билла?
// Сначала получите subof и идентификатор пользователя
SELECT subof, userid
FROM tablename
WHERE name = 'doug'; #answer 0.1.2.4.6
$subof, $userid = mysql_fetch; //pseudo code
// Затем вставьте новую строку, которая будет subof.userid
INSERT into tablename (userid, name, subof) VALUES ('9', 'Bill', '$subof.userid');
Так что теперь у вас есть еще один ряд:
9 Bill 0.1.2.4.6.8
Но подождите ... это еще не все!
Заменен пример с Джеймсом и Дугом для новой таблицы с Джорджем и Хуаном, чтобы сосредоточиться на измененном вопросе :
===== Новый пример с Джорджем и Хуаном
userid | name | subof
1 | John | 0
2 | Joe | 0.1
3 | Jill | 0
4 | Janet | 0.1.2
5 | Juan | 0.1
6 | George| 0.1.2
Джон и Джилл наверху, Джо и
Хуан ниже Джона, а Джанет и
Джордж ниже Джо. Уровень является
используется для передачи комиссии.
ВОПРОС
Мой
клиент хочет видеть как
многие пользователи ниже любого данного пользователя,
(по крайней мере, это ограничено 8 уровнями
вне)
ОТВЕТ
SELECT count(*)
FROM tablename
WHERE subof LIKE 'subof_of_any_given_user+that_users_userid%';
//get those under Joe by using '0.1.2' (Joe's subof + his userid)
ВОПРОС
становится волосатым, когда
мой клиент приходит и говорит "О, Джордж
хотел присоединиться к Хуану, пожалуйста, двигайтесь
его "
ОТВЕТ
ВЫБЕРИТЕ ИД пользователя, имя, подчиненное имя
ОТ таблицы
ГДЕ имя в («Хуан», «Джордж»);
//$juan_userid = 5
//$juan_subof = 0.1
//$updatevalue = $juan_subof.'.'.$juan_userid; //0.1.5
//$george_userid = 6
//$george_subof = 0.1.2
/$subofmatch = $george_subof.'.'.$george_userid; //0.1.2.6
чтобы ваш автоматический запрос выглядел примерно так:
UPDATE tablename
SET subof = (REPLACE(subof, '$george_subof', '$updatevalue'))
WHERE (subof like '$subofmatch%' OR userid = '$george_userid')
// here it is with number values to make it easier to understand //
UPDATE tablename
SET subof = (REPLACE(subof, '0.1.2', '0.1.5'))
WHERE (subof like '0.1.2.6%' OR userid = '6');
Даю вам новый результат:
userid name subof
1 John 0
2 Joe 0.1
3 Jill 0
4 Janet 0.1.2
5 Juan 0.1
6 George 0.1.5
Наслаждайтесь!
Рассвет