Список рефераловодов

605
.
Помогите с кодом для вывода рефераловодов. На сайте установлена реферальная система по кукис. В таблице users создана ячейка ref_id. Когда человек по личной ссылке регистрируется на сайте, то в этой ячейке у него записывается ид пользователя, который его привел. Вот код страницы с приглашенными. Здесь выводится список рефералов, то есть кого пользователь пригласил:
if ($id && $id != $user_id) {
    // Если был запрос на юзера, то получаем его данные
    $req = mysql_query("SELECT * FROM `users` WHERE `id` = '$id' LIMIT 1");
    if (mysql_num_rows($req)) {
        $user = mysql_fetch_assoc($req);
        $textl = 'Приглашенные: ' . $user['name'];
    } else {
        require_once('../incfiles/head.php');
        echo functions::display_error('Такого пользователя не существует');
        require_once("../incfiles/end.php");
        exit;
    }
} else {
    $id = false;
    $textl = 'Приглашенные';
    $user = $datauser;
}
require_once('../incfiles/head.php');

echo '<div class="phdr"><b>' . ($id ? 'Приглашенные: ' . $user['name'] : 'Приглашенные') . '</b></div>';


$counts = mysql_result(mysql_query('SELECT COUNT(*) FROM `users` WHERE `ref_id`=' . $user['id']), 0);
if($counts>0) {
$req = mysql_query('SELECT `id`,`name`,`sex`,`lastdate`,`datereg`,`status`,`rights`, `ip`,`browser`, `rights` FROM `users`  WHERE `ref_id` =' . $user['id'] . ' ORDER BY `datereg` DESC LIMIT '.$start.', '.$kmess);
while ($res = mysql_fetch_assoc($req)) {
echo ($i % 2) ? '<div class="list2">' : '<div class="list1">';
echo functions::display_user($res, 1, (($rights >= 1 && $rights >= $res['rights']) ? 1 : 0)) . '</div>';
++$i;
}
echo '<div class="phdr">Всего приглашенных: ' . $counts . '</div>';
if ($counts > $kmess) {
echo '<div class="menu">' . functions::display_pagination('referals.php' . ($id ? '?id='.$user['id'].'&amp;' : '?'), $start, $counts, $kmess) . '<br />';
echo '<form action="" method="post"><input type="text" name="page" size="2"/> <input type="submit" value="Перейти"/></form></div>';
}
}
else {

echo '<div class="menu">Приглашенных нет!</div>';

}
.
Как сделать список рефераловодов сверху вниз по количеству приглашенных? Не могу составить запросы для их вывода
.
Group by нужно использовать чтобы сгрупировать всех по ref_id и MAX чтобы вывести от большего к меньшему.
.
blackvj, Да не получается составить запрос
.
Ей 25
Надо добавлять ещё одно поле count_ref или как то так, куда записывать число приведенных юзером пользователей. А потом выводить юзеров с сортировкой по этому полю. Потому как при таком раскладе как сейчас, нереально наверно сделать то что ты хочешь.
.
~РайСкиЙ~
Вообщем вот код:
define('_IN_JOHNCMS', 1);

$textl = 'Реферальная система';
$rootpath = '../';

require("../incfiles/core.php");
require("../incfiles/head.php");


if($_GET['user']){
    echo '<div class="phdr">Информация о рефералах</div>';
    $usr_info = mysql_query("SELECT id,name FROM `users` WHERE `ref_id` = '".abs(intval($_GET['user']))."'");
    while($all_refs = mysql_fetch_assoc($usr_info)){
      echo '<div class="list1"><a href="../users/profile.php?user='.$all_refs['id'].'">'.$all_refs['name'].'</a></div>';  
    };
}

echo '<div class="phdr">Статистика рефереров</div>';

    $all_usr = mysql_query("SELECT id,name,ref_id FROM `users` WHERE `ref_id` > '0' GROUP BY `ref_id` LIMIT $start,$kmess"); //Все кого пригласили
    
     while($usr = mysql_fetch_assoc($all_usr)){
        
        $referer = mysql_fetch_assoc(mysql_query("SELECT id,name,ref_id FROM `users` WHERE `id` = '$usr[ref_id]' GROUP BY `ref_id`"));
        
        $all_ref = mysql_result(mysql_query("SELECT COUNT(*) FROM `users` WHERE `ref_id` = '$referer[id]'"),0);
        
        echo '<div class="menu"><a href="ref_stat.php?user='.$referer['id'].'">'.$referer['name'].'</a> - '.$all_ref.' реферал/ов</div>';
     }
     
     $total = mysql_result(mysql_query("SELECT COUNT(*) FROM `users` WHERE `ref_id` > '0' GROUP BY `ref_id`"),0); 
 
echo '<div class="phdr">Всего: '.$total.'</div>';
     
   echo functions::display_pagination('ref_stat.php?', $start, $total, $kmess);
   
require("../incfiles/end.php");

Но выводится непонятно как. В чем ошибка?
Прикрепленные файлы:
.
Блиносвёрт ?
можно одним запросом сделать
$req = mysql_query("select  `u2`.`name`, `u1`.`ref_id`, count(`u1`.`ref_id`) as `counref` 
from  `users` as `u1`  
left join `users` as `u2`
on `u1`.`ref_id` = `u2`.`id`
where `u1`.`ref_id` <> 0
group by (`u1`.`ref_id`) 
order by `counref` desc");
while ($res = mysql_fetch_array($req)) {
        echo '<div>'.$res['name'].': '.$res['counref'].'</div>';
}
.
Тут можно извернуться с джойнами, но я бы не стал так делать, т.к. оно плохо скажется на производительности.
Единственно верный вариант -- добавить поле, в котором будет хранится кол-во приглашенных.
.
reaper, и как в это новое поле будет добавляться? где запрос делать
.
Jane, Спасибо Жень. Сейчас пойду попробую
Всего: 27