Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Всем привет, есть задача отобразить цепочку регистраций пользователей по порядку номеров пригласителей.
То есть например это партнеская программа есть refid (идентификатор пригласителя) нужно чтобы таблица отображала по порядку данные всех пользователей используя данный идентификатор.
Например:
<table class="table">
<thead>
<tr>
<th><b>Пользователь</b></th>
<th><b>Партнеров</b></th>
<th><b>Зарегистрирован</b></th>
</tr>
</thead>
<?PHP
$all_money = 0;
$db->Query("SELECT * FROM tarif1 WHERE ???ВОТ ТУТ НАДО УСЛОВИЕ???");
if($db->NumRows() > 0){
while($ref = $db->FetchArray()){
?>
<tbody>
<tr>
<td><a href="/user<?=$ref["user"]; ?>"><?=$ref["user"]; ?></td>
<td><?=$ref["referals"]; ?></td>
<td><?=date("d.m.Y H:i",$ref["date_reg"]); ?></td>
</tr>
}else echo '<tr><td align="center" colspan="5">У вас нет партнеров</td></tr>'
?>
</tbody></table>
Если мы тут $db->Query("SELECT * FROM tarif1 WHERE refid = '10' ") поставим WHERE refid = '10' то отобразит всех кто зарегистрирован под refid 1... можно создать второе условие
$ref = $db->FetchArray())
$db->Query("SELECT * FROM tarif1 WHERE refid = '$ref["id"]' ") и узнать под кем зарегистрирован следующий пользователь... но если выводить в переменную каждого последующего пользователя.... это не подходит так как список может быть бесконечным...
так вот... КАК сделать так чтобы подбор был цикличным то есть в случае если под пользователем 10 есть кто то еще то оно выводило пользователя с refid 10 и так далее ниже по порядку
Надеюсь мысль выразил корректно... и понятно
Неактивен
Для начала отделим sql от всего остального :-), от php и от вёрстки.
У Вас есть таблица tarif1. Какие в ней есть поля с какими данными?
Дайте пожалуйста тестовое заполнение таблицы - какие данные там будут и какой результат Вы хотите получить.
Неактивен
оки, смотрите:
Таблица tarif1
id/user/userid/sponsor/komanda/status
id - порядковый номер
user - имя пользователя
userid - номер пользователя
sponsor - номер пользователя который пригласил
komanda - номер команды
status - статус пользователя
$user_id - наш id в системе
$db->Query("SELECT * FROM tarif1 WHERE sponsor = '$user_id' AND komanda = '1'"); - выводим всех пользователей которіх пригласили лично
Дальше нам надо чтобы отображались пользователи приглашенные теми кого выводит вышепреведенный запрос, далее те кого пригласили эти участники и так далее
Отредактированно Dimitrius (26.06.2020 23:44:10)
Неактивен
Дайте пожалуйста тестовое заполнение таблицы - какие данные там будут и какой результат Вы хотите получить.
Неактивен
Не понимаю что именно вы хотите? просто пример данных?
типо этого?
id - 1
user - Frankenshtein
userid - 35
sponsor - 12
komanda - 1
status - 0
да бли не важно какие данные мне надо знать как выводить строку с данными по последнему значению "sponsor" по очереди друг за другом до бесконечности...
например есть я пользователь номер 1, я пригласил партнера номер 2 он пригласил номер 3 (соответственно у третего sponsor=2), третий пригласил четвертого (sponsor=3) и так далее, и мне надо чтобы было видно их всех по порядку то есть при запросе $db->Query("SELECT * FROM tarif1 WHERE sponsor = '$user_id' AND komanda = '1'"); я буду видеть только второго... а мне надо видеть всех кто стоит после него
Я знаю что как то это можно сделать только вот никак не соображу как именно...
Отредактированно Dimitrius (26.06.2020 23:56:39)
Неактивен
зависит от версии
если есть cte, то см примеры в https://sqlinfo.ru/articles/info/28.html
в более ранних с помощью процедуры, см https://sqlinfo.ru/articles/info/22.html
Неактивен
Или же на стороне клиента это делать (в данном случае php).
Какая у Вас версия mysql?
Неактивен
MySQL 5.7
MySQL 8.0 (основной сервер)
есть два сервера с разными версиями
То есть можно попробовать так?
WITH RECURSIVE cte AS
(
# источник рекурсии
SELECT * FROM tarif1 WHERE sponsor IS NULL
UNION ALL
# рекурсивный SELECT
SELECT * FROM tarif1 c JOIN cte
ON cte.userid=c.sponsor # нахождение потомков
)
SELECT name FROM cte;
Отредактированно Dimitrius (27.06.2020 00:14:48)
Неактивен
в 8ке можно с помощью cte
в 5.7 придется писать процедуру
Неактивен
окей, например есть
WITH RECURSIVE cte AS
(
# источник рекурсии
SELECT * FROM tarif1 WHERE sponsor IS NULL
UNION ALL
# рекурсивный SELECT
SELECT * FROM tarif1 c JOIN cte
ON cte.userid=c.sponsor # нахождение потомков
)
SELECT name FROM cte;
В примере указаны конкретные столбцы
SELECT c.category_id, c.name FROM category c JOIN cte
ON cte.category_id=c.parent # нахождение потомков
Если я сделаю такой запрос, он будет обработан корректно? SELECT * FROM tarif1 c JOIN cte
ON cte.userid=c.sponsor # нахождение потомков
то есть мне надо все значения чтобы выводились и как их запхнуть в переменную? тем же
while($ref = $db->FetchArray()) ????
это что то типа вот этого надо прописывать?
$db->Query(WITH RECURSIVE cte AS
(
# источник рекурсии
SELECT * FROM tarif1 WHERE sponsor IS NULL
UNION ALL
# рекурсивный SELECT
SELECT * FROM tarif1 c JOIN cte
ON cte.userid=c.sponsor # нахождение потомков
));
Отредактированно Dimitrius (27.06.2020 00:31:28)
Неактивен
Dimitrius написал:
Если я сделаю такой запрос, он будет обработан корректно? SELECT * FROM tarif1 c JOIN cte
ON cte.userid=c.sponsor # нахождение потомков
нет конечно, это лишь часть запроса, которая отдельно работать не будет
запрос это
Неактивен
блин ну чего так сложно то...
мне надо так например есть я пользователь номер 1, я пригласил партнера номер 2 он пригласил номер 3 (соответственно у третего sponsor=2), третий пригласил четвертого (sponsor=3) и так далее, и мне надо чтобы было видно их всех по порядку то есть при запросе $db->Query("SELECT * FROM tarif1 WHERE sponsor = '$user_id' AND komanda = '1'"); я буду видеть только второго... а мне надо видеть всех кто стоит после него
мне нужны все данные всех пользователей со всей структуры в таблице поп порядку отобразить
Неактивен
Спасибо вам за старания... наверное я слишком туп для такого еще...
Неактивен
берете пример из раздела "Получение всех потомков заданного узла" и меняете в нем имена колонок/таблиц на свои
Неактивен
$db->Query("WITH RECURSIVE cte AS
(
SELECT category_id, name,
CAST(category_id AS CHAR(200)) AS path,
0 as depth
FROM category WHERE name='PORTABLE ELECTRONICS' # sub-tree root
UNION ALL
SELECT c.category_id,
c.name,
CONCAT(cte.path, ",", c.category_id),
cte.depth+1
FROM category c JOIN cte
ON cte.category_id=c.parent
)
SELECT * FROM cte ORDER BY path;"); Вот так??? и сменить только переменные?
Неактивен
да
Неактивен
Страниц: 1