Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите сделать статистику
 
 автор: kodges   (11.12.2006 в 09:40)   письмо автору
 
 

Есть таблица в базе 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-го уровня.

Вопрос:
Как вывести статистику у кого из клиентов сколько клиентов по уровням учитывая что статистика нужна относительно любого клиента и что клиентов в таблице может быть тысячи человек ???

   
 
 автор: _Dreamer_   (12.12.2006 в 22:33)   письмо автору
 
   для: 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

   
 
 автор: kodges   (13.12.2006 в 12:04)   письмо автору
 
   для: _Dreamer_   (12.12.2006 в 22:33)
 

Спасибо что хоть вы ответили.
Честно говоря не хотелось создавать лишних таблиц, но похоже если ничего лучшего не найду то придется последовать вашему примеру.

   
 
 автор: _Dreamer_   (13.12.2006 в 12:44)   письмо автору
 
   для: kodges   (13.12.2006 в 12:04)
 

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

   
 
 автор: cheops   (13.12.2006 в 13:50)   письмо автору
 
   для: kodges   (11.12.2006 в 09:40)
 

Тут пожалуй придётся рекурсивно спускаться... восстанавливая для каждого клиента дерево его рефералов... и подсчитывая количество рефералов на каждом уровне. Для одного клиента это можно сделать достаточно быстро, для всех одновременно - это будет занимать значительное время. Такая статистика часто будет требоваться?

   
 
 автор: kodges   (13.12.2006 в 17:54)   письмо автору
 
   для: cheops   (13.12.2006 в 13:50)
 

Ну вообщето, я планировал что у клиента постоянно будет она отображаться как только клиент заходит в закрытый раздел сайта (авторизуется). Но учитывая то что весь день клиент не будет щелкать кнопочку обновить а скажем ему достаточно будет раз или 2 в день может реже зайти на сайт для просмотра продвижения его клиентов (глянуть статистику) то я не думаю что это будет отнимать много ресурсов.

   
 
 автор: cheops   (13.12.2006 в 18:19)   письмо автору
 
   для: 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(3220238160);
  echo 
"<pre>";
  
print_r($arr);
  echo 
"</pre>";
?>

   
 
 автор: kodges   (01.02.2007 в 19:49)   письмо автору
 
   для: 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(3220238160); 
  echo 
"<pre>"
  
print_r($arr); 
  echo 
"</pre>"
?> 


ругается на эту строку:


 $arr[$level] += $total; 

   
 
 автор: cheops   (01.02.2007 в 20:42)   письмо автору
 
   для: kodges   (01.02.2007 в 19:49)
 

Как ругается?

   
 
 автор: kodges   (02.02.2007 в 06:50)   письмо автору
 
   для: cheops   (01.02.2007 в 20:42)
 

Parse error: syntax error, unexpected T_VARIABLE in /www/lifemoneyru/htdocs/test.php on line 47

   
 
 автор: Trianon   (02.02.2007 в 09:51)   письмо автору
 
   для: kodges   (02.02.2007 в 06:50)
 

Так ведь действительно unexpected!

   
 
 автор: kodges   (02.02.2007 в 09:58)   письмо автору
 
   для: Trianon   (02.02.2007 в 09:51)
 

ну а что надо сделать то ?

   
 
 автор: cheops   (02.02.2007 в 11:57)   письмо автору
 
   для: kodges   (01.02.2007 в 19:49)
 

После
<?php
  $total 
mysql_num_rows($tbl)  
?>

точку с запятой поставьте.

   
 
 автор: kodges   (02.02.2007 в 14:41)   письмо автору
 
   для: cheops   (02.02.2007 в 11:57)
 

Теперь ошибок нет, выдает



Array
(
    [1] => 0
)


Но что с этим дальше желать я не знаю... поидее должно ведь было показать количество клиентов на 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   (03.02.2007 в 23:56)   письмо автору
 
   для: kodges   (02.02.2007 в 14:41)
 

Люди ну помогите проблему решить .... позарез надо ... Если кто даст готовое решение плачу 5 $

   
 
 автор: cheops   (04.02.2007 в 00:20)   письмо автору
 
   для: kodges   (02.02.2007 в 14:41)
 

Не понятно, а что вам требуется?

   
 
 автор: kodges   (04.02.2007 в 06:52)   письмо автору
 
   для: cheops   (04.02.2007 в 00:20)
 

Мне требуется вывести количество клиентов на всех уровнях относительно любого из клиентов. Напимер исходя из таблици которую я обрисовал выше у клиента name1 клиентов первого уровня - 3, второго уровня - 4, третьего уровня - 1. Но это я вижу по таблице а мне нужен скрипт который это будет отображать причем относительно не только клиента name1 но и любого другого, причем сколько уровней и клиентов всего, не должно играть значения, отображать надо до последнего существуюшего клиента в цепочке по цровням.

Должно отображаться примерно так:

Таблица клиентов относительно клиента name1
Уровень | кол-во клиентов
-------------------------------------
1 | 3
2 | 4
3 | 1
и так до конца...

   
 
 автор: kodges   (05.02.2007 в 07:36)   письмо автору
 
   для: kodges   (04.02.2007 в 06:52)
 

Всем привет, вот уже который раз захожу а помощи все нету ни от кого .... люди ну пожалуйста ну очень надо, помогите с решением задачей, плизззз. Сам никак чтото не могу...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования