Помогите с кодом для вывода рефераловодов. На сайте установлена реферальная система по кукис. В таблице 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'].'&' : '?'), $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, Да не получается составить запрос
Надо добавлять ещё одно поле 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, Спасибо Жень. Сейчас пойду попробую