|
|
|
| Есть таблица в базе MySQl с двумя полями. примерно такой вид
klient | ID | name
------------------------------------------------------------
322023816 | 322023816 | vasa
322023816 | 182220460 | peta
322023816 | 704833984 | q
322023816 | 89202882 | w
89202882 | 247650147 | e
247650147 | 527038575 | r
527038575 | 331848145 | t
527038575 | 577117920 | y
527038575 | 693389893 | u
331848145 | 397399903 | i
577117920 | 167053224 | o
527038575 | 812133789 | p
247650147 | 730041504 | a
----------------------------------------------------------------
Изходя из таблици видно что у клиента 322023816 в таблице 3 клиента,
у клиента 89202882 в таблице 1 клиент,
у клиента 247650147 в таблице 2 клиента,
у клиента 527038575 в таблице 4 клиента,
у клиента 331848145 в таблице 1 клиент,
у клиента 577117920 в таблице 1 клиент,
Причем относительно клиента 322023816 у него 3 клиента 1-го уровня, 1 клиент второго уровня,
2 клиента 3-го уровня, 4 клиента 4-го уровня и 2 клиента 5-го уровня.
Вопрос:
Как вывести статистику у кого из клиентов сколько клиентов по уровням учитывая что статистика нужна относительно любого клиента и что клиентов в таблице может быть тысячи человек ??? | |
|
|
|
|
|
|
|
для: kodges
(11.12.2006 в 09:40)
| | Это для сетевого маркетинга (mlm)?.. Я недавно разрабатывал подобную систему
У меня было много таблиц.. В одной из них была инфа о структуре дерева рефералов (клиентов, как сказано у вас).. примерно такая
create table ref
(
code varchar(32) not null, -- код реферала
pcode varchar(32) not null, -- код реферала, спонсора (под ним зарегестрирован рефелал code)
.....
) type=InnoDB;
|
а в другую таблицу заносилась инфа после регистрации нового пользователя под кем то..
create table ref_pay
(
pay_code varchar(32) not null, -- код рефела от которого идут начисления
ref_code varchar(32) not null, -- код реферала которому идут начисления (по уровням вверх, пока не дойдем до самого верхнего)
sum decimal(16,2) not null, -- сумма начисления
level int(2), -- уровень, на котором идет начисление (у меня было от 1 до 21)
......
) type=InnoDB;
|
Получается чтобы вывести все рефералы всех уровней определенного клиента просто делается что то подобное
$ref_code = $_GET['ref_code'];
list($max_level) = mysql_fetch_row(mysql_query("SELECT max(level) FROM ref_pay WHERE ref_code = '$ref_code'"));
for ($level = 1; $level <= $max_level; ++$level)
{
$result = mysql_query("SELECT pay_code,sum FROM ref_pay WHERE ref_code = '$ref_code' AND level = $level");
while ($row = mysql_fetch_row($result))
{
list($pay_code,$sum) = $row;
echo "Уровень: $level | Реферал: $pay_code | Сумма начисления: $sum<br>";
}
}
|
Если не хранить дополнительную информацию об уровнях рефералов (клиентов) то задача воспроизведения структуры сформированной пирамиды будет весьма ресурсоемкой, придется делать намного больше запросов.. а так у меня делается максимум 21 запрос, к тому же это может помочь для формирования всевозможных отчетов и подробной статистики по всему дереву mlm | |
|
|
|
|
|
|
|
для: _Dreamer_
(12.12.2006 в 22:33)
| | Спасибо что хоть вы ответили.
Честно говоря не хотелось создавать лишних таблиц, но похоже если ничего лучшего не найду то придется последовать вашему примеру. | |
|
|
|
|
|
|
|
для: kodges
(13.12.2006 в 12:04)
| | было бы интересно узнать ваше решение, если что найдете..
тоже очень сильно нужна была информация по этому поводу в свое время, ничего не нашел и решил исходить из того что если не использовать дополнительную таблицу с записями характеризующими связи рефералов на определенном уровне, то чтобы получить все рефералы на всех нижних уровнях определенного клиента, потребуется делать к бд количество запросов равное количеству этих всех рефералов.. а если речь идет о тысячах человек, то сами понимаете к чему это может привести.. но возмножно в чем то не прав и есть допустимые решения без использования дополнительных таблиц, хотя это не так страшно в приципе | |
|
|
|
|
|
|
|
для: kodges
(11.12.2006 в 09:40)
| | Тут пожалуй придётся рекурсивно спускаться... восстанавливая для каждого клиента дерево его рефералов... и подсчитывая количество рефералов на каждом уровне. Для одного клиента это можно сделать достаточно быстро, для всех одновременно - это будет занимать значительное время. Такая статистика часто будет требоваться? | |
|
|
|
|
|
|
|
для: cheops
(13.12.2006 в 13:50)
| | Ну вообщето, я планировал что у клиента постоянно будет она отображаться как только клиент заходит в закрытый раздел сайта (авторизуется). Но учитывая то что весь день клиент не будет щелкать кнопочку обновить а скажем ему достаточно будет раз или 2 в день может реже зайти на сайт для просмотра продвижения его клиентов (глянуть статистику) то я не думаю что это будет отнимать много ресурсов. | |
|
|
|
|
|
|
|
для: kodges
(13.12.2006 в 17:54)
| | Можно начать развивать приложение со следующей рекурсивной функции
<?php
function level($id, $level)
{
global $arr;
// Увеличиваем текущий уровень
$level++;
// Запрашиваем подчинённых клиентов
$query = "SELECT * FROM tbl WHERE klient = $id";
$tbl = mysql_query($query);
if(!$tbl) exit(mysql_error());
// Подсчитываем количество клиентов на текущем уровне
$total = mysql_num_rows($tbl)
$arr[$level] += $total;
// Если есть хоть один клиент
if($total)
{
while($table = mysql_fetch_array($tbl))
{
level($id, $level);
}
}
}
level(322023816, 0);
echo "<pre>";
print_r($arr);
echo "</pre>";
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(13.12.2006 в 18:19)
| | Здравствуйте.
Решил продолжить разработку сбора статистики.
Вобщем сделал так как вы сказали:
<?php
$id="322023816";
$level=1;
function level($id, $level)
{
global $arr;
// Увеличиваем текущий уровень
$level++;
// Запрашиваем подчинённых клиентов
$query = "SELECT * FROM tbl WHERE klient = $id";
$tbl = mysql_query($query);
if(!$tbl) exit(mysql_error());
// Подсчитываем количество клиентов на текущем уровне
$total = mysql_num_rows($tbl)
$arr[$level] += $total;
// Если есть хоть один клиент
if($total)
{
while($table = mysql_fetch_array($tbl))
{
level($id, $level);
}
}
}
level(322023816, 0);
echo "<pre>";
print_r($arr);
echo "</pre>";
?>
|
ругается на эту строку:
| |
|
|
|
|
|
|
|
для: kodges
(01.02.2007 в 19:49)
| | Как ругается? | |
|
|
|
|
|
|
|
для: cheops
(01.02.2007 в 20:42)
| | Parse error: syntax error, unexpected T_VARIABLE in /www/lifemoneyru/htdocs/test.php on line 47 | |
|
|
|
|
|
|
|
для: kodges
(02.02.2007 в 06:50)
| | Так ведь действительно unexpected! | |
|
|
|
|
|
|
|
для: Trianon
(02.02.2007 в 09:51)
| | ну а что надо сделать то ? | |
|
|
|
|
|
|
|
для: kodges
(01.02.2007 в 19:49)
| | После
<?php
$total = mysql_num_rows($tbl)
?>
|
точку с запятой поставьте. | |
|
|
|
|
|
|
|
для: cheops
(02.02.2007 в 11:57)
| | Теперь ошибок нет, выдает
Но что с этим дальше желать я не знаю... поидее должно ведь было показать количество клиентов на 1 уровне...
я сделал немного по своему но для меня понятнее:
<?
include_once("config.php");
$query=mysql_query("SELECT * FROM users WHERE referal='3821864'");
if(!$query) exit(mysql_error());
while($res[] = mysql_fetch_array($query));
$i = 0;
do
{
$num=mysql_num_rows($query);
echo'<tr><td align="center">'.$i.'</td><td align="center">'.$num.'</td></tr>';
$query=mysql_query("SELECT * FROM users WHERE referal='".$res[$i]['purshe']."'");
if(!$query) exit(mysql_error());
while($res[] = mysql_fetch_array($query));
$i++;
}
while($num != 0);
?>
|
данные взяты из другой таблици поэтому и цифры другие.
таблица такая :
id | name | purshe | referal
----------------------------------------------
1 | name1 | 3821864 | 0
2 | name2 | 1234567 | 3821864
3 | name3 | 7654321 | 3821864
4 | name4 | 3597621 | 3821864
5 | name5 | 2546831 | 1234567
6 | name6 | 5985672 | 3597621
7 | name7 | 2265831 | 7654321
8 | name8 | 6843384 | 3597621
9 | name9 | 3544862 | 2265831
и так далее ....
Исходя из таблици видно что у клиента name1 клиентов 1 уровня - 3, второго уровня - 4, третьего уровня - 1.
Так вот, мой код корректно отображает только количество клиентов первого уровня а остальные уже неверно :(
Что делать дальше не знаю, помогите с моим кодом или скажите что сделать с кодом cheopsa. | |
|
|
|
|
|
|
|
для: kodges
(02.02.2007 в 14:41)
| | Люди ну помогите проблему решить .... позарез надо ... Если кто даст готовое решение плачу 5 $ | |
|
|
|
|
|
|
|
для: kodges
(02.02.2007 в 14:41)
| | Не понятно, а что вам требуется? | |
|
|
|
|
|
|
|
для: cheops
(04.02.2007 в 00:20)
| | Мне требуется вывести количество клиентов на всех уровнях относительно любого из клиентов. Напимер исходя из таблици которую я обрисовал выше у клиента name1 клиентов первого уровня - 3, второго уровня - 4, третьего уровня - 1. Но это я вижу по таблице а мне нужен скрипт который это будет отображать причем относительно не только клиента name1 но и любого другого, причем сколько уровней и клиентов всего, не должно играть значения, отображать надо до последнего существуюшего клиента в цепочке по цровням.
Должно отображаться примерно так:
Таблица клиентов относительно клиента name1
Уровень | кол-во клиентов
-------------------------------------
1 | 3
2 | 4
3 | 1
и так до конца... | |
|
|
|
|
|
|
|
для: kodges
(04.02.2007 в 06:52)
| | Всем привет, вот уже который раз захожу а помощи все нету ни от кого .... люди ну пожалуйста ну очень надо, помогите с решением задачей, плизззз. Сам никак чтото не могу... | |
|
|
|