SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 26.06.2020 22:55:22

Dimitrius
Участник
Зарегистрирован: 26.06.2020
Сообщений: 8

Как создать запрос с бесконечным подбором данных в переменную?

Всем привет, есть задача отобразить цепочку регистраций пользователей по порядку номеров пригласителей.
То есть например это партнеская программа есть 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 и так далее ниже по порядку
Надеюсь мысль выразил корректно... и понятно

Неактивен

 

#2 26.06.2020 23:32:11

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2295

Re: Как создать запрос с бесконечным подбором данных в переменную?

Для начала отделим sql от всего остального :-), от php и от вёрстки.

У Вас есть таблица tarif1. Какие в ней есть поля с какими данными?
Дайте пожалуйста тестовое заполнение таблицы - какие данные там будут и какой результат Вы хотите получить.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 26.06.2020 23:41:55

Dimitrius
Участник
Зарегистрирован: 26.06.2020
Сообщений: 8

Re: Как создать запрос с бесконечным подбором данных в переменную?

оки, смотрите:
Таблица 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)

Неактивен

 

#4 26.06.2020 23:47:37

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2295

Re: Как создать запрос с бесконечным подбором данных в переменную?

Дайте пожалуйста тестовое заполнение таблицы - какие данные там будут и какой результат Вы хотите получить.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 26.06.2020 23:50:41

Dimitrius
Участник
Зарегистрирован: 26.06.2020
Сообщений: 8

Re: Как создать запрос с бесконечным подбором данных в переменную?

Не понимаю что именно вы хотите? просто пример данных?
типо этого?

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)

Неактивен

 

#6 27.06.2020 00:02:40

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5699

Re: Как создать запрос с бесконечным подбором данных в переменную?

зависит от версии
если есть cte, то см примеры в https://sqlinfo.ru/articles/info/28.html
в более ранних с помощью процедуры, см https://sqlinfo.ru/articles/info/22.html

Неактивен

 

#7 27.06.2020 00:07:05

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2295

Re: Как создать запрос с бесконечным подбором данных в переменную?

Или же на стороне клиента это делать (в данном случае php).
Какая у Вас версия mysql?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#8 27.06.2020 00:10:41

Dimitrius
Участник
Зарегистрирован: 26.06.2020
Сообщений: 8

Re: Как создать запрос с бесконечным подбором данных в переменную?

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)

Неактивен

 

#9 27.06.2020 00:14:15

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5699

Re: Как создать запрос с бесконечным подбором данных в переменную?

в 8ке можно с помощью cte
в 5.7 придется писать процедуру

Неактивен

 

#10 27.06.2020 00:19:47

Dimitrius
Участник
Зарегистрирован: 26.06.2020
Сообщений: 8

Re: Как создать запрос с бесконечным подбором данных в переменную?

окей, например есть

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)

Неактивен

 

#11 27.06.2020 00:33:32

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5699

Re: Как создать запрос с бесконечным подбором данных в переменную?

Dimitrius написал:

Если я сделаю такой запрос, он будет обработан корректно? SELECT * FROM tarif1  c JOIN cte
  ON cte.userid=c.sponsor # нахождение потомков

нет конечно, это лишь часть запроса, которая отдельно работать не будет
запрос это

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 * FROM cte;


и разве вам нужен обход всего дерева?

Неактивен

 

#12 27.06.2020 00:36:06

Dimitrius
Участник
Зарегистрирован: 26.06.2020
Сообщений: 8

Re: Как создать запрос с бесконечным подбором данных в переменную?

блин ну чего так сложно то...
sad
мне надо так например есть я пользователь номер 1, я пригласил партнера номер 2 он пригласил номер 3 (соответственно у третего sponsor=2), третий пригласил четвертого (sponsor=3) и так далее, и мне надо чтобы было видно их всех по порядку то есть при запросе $db->Query("SELECT * FROM tarif1 WHERE sponsor = '$user_id' AND komanda = '1'"); я буду видеть только второго... а мне надо видеть всех кто стоит после него
мне нужны все данные всех пользователей со всей структуры в таблице поп порядку отобразить

Неактивен

 

#13 27.06.2020 00:37:10

Dimitrius
Участник
Зарегистрирован: 26.06.2020
Сообщений: 8

Re: Как создать запрос с бесконечным подбором данных в переменную?

Спасибо вам за старания... наверное я слишком туп для такого еще...

Неактивен

 

#14 27.06.2020 00:42:55

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5699

Re: Как создать запрос с бесконечным подбором данных в переменную?

берете пример из раздела "Получение всех потомков заданного узла" и меняете в нем имена колонок/таблиц на свои

Неактивен

 

#15 27.06.2020 00:49:33

Dimitrius
Участник
Зарегистрирован: 26.06.2020
Сообщений: 8

Re: Как создать запрос с бесконечным подбором данных в переменную?

$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;"); Вот так??? и сменить только переменные?

Неактивен

 

#16 27.06.2020 00:56:00

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5699

Re: Как создать запрос с бесконечным подбором данных в переменную?

да

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson