Как узнать относится ли значение из одной таблицы к значению из другой?

Тема в разделе "Как сделать...", создана пользователем Newageman, 9 авг 2019.

Метки:
Статус темы:
Закрыта.
  1. Newageman

    Newageman Создатель

    Регистр.:
    3 янв 2012
    Сообщения:
    44
    Симпатии:
    4
    Всем здравствуйте. Сайт на Wordpress. Есть 4 таблицы в БД Mysql которые надо как-то связать.

    1. orders со столбцами uid, lid, amount_value, status, create_date
    2. users со столбцом id
    3. referrals со столбцами affiliate_id, amount, status
    4. affiliates со столбцами id, uid
    Значения orders.uid, users.id и affiliates.uid совпадают. Например: 14, 14 и 14

    Значения referrals.affiliate_id и affiliates.id совпадают. Например: 12 и 12

    Таблица affiliates содержит в себе значения и 14 и 12 (возможно это как-то поможет в связке этих таблиц/столбцов).

    Все эти значения относятся к одному пользователю.

    Сейчас написан такой код (код хоть и кривой, но свою функцию выполняет. Всё выводит и считает в личном кабинете для каждого пользователя) В нём используются только первые две таблицы:
    Код:
    <?php
    require_once 'connection.php';
      $link = mysqli_connect($host, $user, $password, $database);
      if (!$link) {
        echo 'Не могу соединиться с БД. Код ошибки: ' . mysqli_connect_errno() . ', ошибка: ' . mysqli_connect_error();
        exit;
      }
        global $wpdb;
        $cur_user = wp_get_current_user()->user_login;
        $cur_id = get_current_user_id();
        $now = time();
     
      $sql = mysqli_query($link, "SELECT " . $wpdb->base_prefix . "orders.create_date, " . $wpdb->base_prefix . "orders.uid, " . $wpdb->base_prefix . "orders.status , " . $wpdb->base_prefix . "orders.amount_value, " . $wpdb->base_prefix . "orders.lid, " . $wpdb->base_prefix . "users.id FROM " . $wpdb->base_prefix . "orders, " . $wpdb->base_prefix . "users WHERE " . $wpdb->base_prefix . "orders.uid=" . $wpdb->base_prefix . "users.id AND status= 'Completed'");
     
      while ($result = mysqli_fetch_array($sql)) {
                  $start=($result['create_date']);
                  $user_uid=($result['uid']);
                  $user_id=($result['id']);
                  $stat=($result['status']);
                  $reg_lid=($result['lid']);
                  $amount=($result['amount_value']);
                  $datediff = date('d.m.Y') - date("d.m.Y", strtotime($result['create_date']));   
                 
          if ($user_uid==$cur_id&&($reg_lid['lid']==1)) {
            /* Начисляем процент для lid=1*/
                $proc = 25;  //Процентов за всё время
                $proc_d =0.25*$datediff;  //Процентов в день
                $proc = $amount/100*$proc;  // высчитываем процент от числа
                $proc_d = $amount/100*$proc_d;  // высчитываем процент в день от числа
                $amountWithPct_all = $amount + $proc;  // суммируем число с процентами от этого числа
                $amountWithPct_d = $amount + $proc_d;  // суммируем число с процентами в день от этого числа
                round ($amountWithPct_all);  // округляем
                round ($amountWithPct_d);    // округляем   
           
            echo "Дата оплаты: {$start}<br/>";
              echo "Прошло дней: {$datediff}<br/>";
              echo "Внесено: {$amount} ₽<br/>";
            echo "Заработано на данный момент: $proc_d ₽<br/>";
            echo "Cумма на конец периода: $amountWithPct_all ₽<br/><br/>";
          }
       
          elseif($user_uid==$cur_id&&($reg_lid['lid']==2)){
          /* Начисляем процент для lid=2*/
                $proc = 60; //Процентов за всё время
                $proc_d =0.6*$datediff; //Процентов в день
                $proc = $amount/100*$proc; // высчитываем процент от числа
                $proc_d = $amount/200*$proc_d; // высчитываем процент в день от числа
                $amountWithPct_all = $amount + $proc; // суммируем число с процентами от этого числа
                $amountWithPct_d = $amount + $proc_d; // суммируем число с процентами в день от этого числа
                round ($amountWithPct_all); // округляем
                round ($amountWithPct_d); // округляем
           
            echo "Дата оплаты: {$start}<br/>";
              echo "Прошло дней: {$datediff}<br/>";
              echo "Внесено: {$amount} ₽<br/>";
            echo "Заработано на данный момент: $proc_d ₽<br/>";
            echo "Cумма на конец периода: $amountWithPct_all ₽<br/><br/>";   
    }
          elseif ($user_uid==$cur_id&&($reg_lid['lid']==3)){
                    /* Начисляем процент для lid=3*/
                $proc = 89; //Процентов за всё время
                $proc_d =0.89*$datediff; //Процентов в день
                $proc = $amount/100*$proc; // высчитываем процент от числа
                $proc_d = $amount/300*$proc_d; // высчитываем процент в день от числа
                $amountWithPct_all = $amount + $proc; // суммируем число с процентами от этого числа
                $amountWithPct_d = $amount + $proc_d; // суммируем число с процентами в день от этого числа
                round ($amountWithPct_all); // округляем
                round ($amountWithPct_d); // округляем
           
            echo "Дата оплаты: {$start}<br/>";
              echo "Прошло дней: {$datediff}<br/>";
              echo "Внесено: {$amount} ₽<br/>";
            echo "Заработано на данный момент: $proc_d ₽<br/>";
            echo "Cумма на конец периода: $amountWithPct_all ₽<br/><br/>";
    }
          else{
            }   
      }
    ?>
    bd_orders.png bd_users.png bd_affiliates.png bd_referrals.png
    Вопрос: Как связать все эти столбцы между собой чтобы скрипт понял что это относится к одному пользователю? В соответствии с этим прибавить значение из referrals.amount к $amount (из кода выше) для пользователя к которому относятся эти столбцы. Ковыряю, ковыряю, а толка 0. Знаний совсем не хватает. Заранее большое спасибо.
     
    Последнее редактирование: 9 авг 2019
  2. kmrd

    kmrd Создатель

    Регистр.:
    23 ноя 2016
    Сообщения:
    18
    Симпатии:
    16
    Средствами SQL? Например
    Код:
    SELECT * FROM orders
    LEFT JOIN users ON orders.uid=users.id
    LEFT JOIN affiliates ON orders.uid=affiliates .uid
    LEFT JOIN referrals ON referrals.affiliate_id=affiliates .uid
    WHERE ...
    
    На самом деле логичнее делать селект из users, но и так тоже пойдёт.
     
    Newageman нравится это.
  3. Newageman

    Newageman Создатель

    Регистр.:
    3 янв 2012
    Сообщения:
    44
    Симпатии:
    4
    Спасибо. Как я понимаю с помощью этого запроса мы связали значения всех 4 таблиц по столбцам uid, id, uid, affiliate_id . Правильно?
    Получилось так:
    Код:
        $sql = mysqli_query($link, "SELECT * FROM " . $wpdb->base_prefix . "ihc_orders
    LEFT JOIN " . $wpdb->base_prefix . "users ON " . $wpdb->base_prefix . "ihc_orders.uid=" . $wpdb->base_prefix . "users.id
    LEFT JOIN " . $wpdb->base_prefix . "uap_affiliates ON " . $wpdb->base_prefix . "ihc_orders.uid=" . $wpdb->base_prefix . "uap_affiliates .uid
    LEFT JOIN " . $wpdb->base_prefix . "uap_referrals ON " . $wpdb->base_prefix . "uap_referrals.affiliate_id=" . $wpdb->base_prefix . "uap_affiliates .uid
    WHERE " . $wpdb->base_prefix . "ihc_orders.uid=" . $wpdb->base_prefix . "users.id ");
    Подскажите, пожалуйста, а как теперь получить значение из таблицы referrals столбец amount?
     
    Последнее редактирование: 9 авг 2019
  4. Minor

    Minor

    Регистр.:
    16 авг 2012
    Сообщения:
    216
    Симпатии:
    85
    По аналогии с остальными ячейками
    Код:
    while ($result = mysqli_fetch_array($sql)) {
       ....
       $amount2=($result['amount']); //$amount2 т.к. $amount уже есть
    
     
    Последнее редактирование: 10 авг 2019
  5. Newageman

    Newageman Создатель

    Регистр.:
    3 янв 2012
    Сообщения:
    44
    Симпатии:
    4
    Всем спасибо. Вопрос решён. Можно закрывать тему.
    Код:
        <?php
    require_once 'connection.php';
      $link = mysqli_connect($host, $user, $password, $database);
      if (!$link) {
        echo 'Не могу соединиться с БД. Код ошибки: ' . mysqli_connect_errno() . ', ошибка: ' . mysqli_connect_error();
        exit;
      }
        global $wpdb;
        $cur_user = wp_get_current_user()->user_login;
        $cur_id = get_current_user_id();
        $now = time();
       
        $sql = mysqli_query($link, "SELECT o.create_date, o.uid, o.status, o.amount_value, o.lid, u.id, sum(r.amount) AS referrals_amount
        FROM " . $wpdb->base_prefix . "users AS u
        INNER JOIN " . $wpdb->base_prefix . "ihc_orders AS o ON o.uid = u.id
        INNER JOIN " . $wpdb->base_prefix . "uap_affiliates AS a ON a.uid = u.id
        INNER JOIN " . $wpdb->base_prefix . "uap_referrals AS r ON r.affiliate_id = a.id
        WHERE o.status = 'Completed'
        GROUP BY r.affiliate_id ");
       
      while ($result = mysqli_fetch_array($sql)) {
                  $start=($result['create_date']);
                  $user_uid=($result['uid']);
                  $user_id=($result['id']);
                  $stat=($result['status']);
                  $reg_lid=($result['lid']);
                  $amount=($result['amount_value']);
                  $datediff = date('d.m.Y') - date("d.m.Y", strtotime($result['create_date']));
          $referrals_amount=($result['referrals_amount']);     
                   
          if ($user_uid==$cur_id&&($reg_lid['lid']==1)) {
            /* Начисляем процент для lid=1*/ 
                $proc = 25;  //Процентов за всё время
                $proc_d =0.25*$datediff;  //Процентов в день
                $proc = ($amount+$referrals_amount)/100*$proc;  // высчитываем процент от числа
                $proc_d = ($amount+$referrals_amount)/100*$proc_d;  // высчитываем процент в день от числа
              $amount_all = $referrals_amount + $proc_d;
                $amountWithPct_all = $amount + $referrals_amount + $proc; // суммируем число с процентами от этого числа
                $amountWithPct_d = $amount + $referrals_amount + $proc_d; // суммируем число с процентами в день от этого числа
                round ($amountWithPct_all); // округляем
                round ($amountWithPct_d); // округляем
             
            echo "Дата оплаты: {$start}<br/>";
              echo "Прошло дней: {$datediff}<br/>";
              echo "Внесено: {$amount} ₽<br/>";
            echo "Бонусы: {$referrals_amount} ₽<br/>";
            echo "Проценты: {$proc_d} ₽<br/>";
            echo "Бонусы + проценты: $amount_all ₽<br/>";
            echo "Cумма на конец периода: $amountWithPct_all ₽<br/><br/>";
          }
         
          elseif($user_uid==$cur_id&&($reg_lid['lid']==2)){
          /* Начисляем процент для lid=2*/
                $proc = 60; //Процентов за всё время
                $proc_d =0.6*$datediff; //Процентов в день
                $proc = ($amount+$referrals_amount)/100*$proc; // высчитываем процент от числа
                $proc_d = ($amount+$referrals_amount)/200*$proc_d; // высчитываем процент в день от числа
                  $amount_all = $referrals_amount + $proc_d;
                $amountWithPct_all = $amount + $referrals_amount + $proc; // суммируем число с процентами от этого числа
                $amountWithPct_d = $amount + $referrals_amount + $proc_d; // суммируем число с процентами в день от этого числа
                round ($amountWithPct_all); // округляем
                round ($amountWithPct_d); // округляем
             
            echo "Дата оплаты: {$start}<br/>";
              echo "Прошло дней: {$datediff}<br/>";
              echo "Внесено: {$amount} ₽<br/>";
            echo "Бонусы: {$referrals_amount} ₽<br/>";
            echo "Проценты: {$proc_d} ₽<br/>";
            echo "Бонусы + проценты: $amount_all ₽<br/>";
            echo "Cумма на конец периода: $amountWithPct_all ₽<br/><br/>";
                   
       
    }
          elseif ($user_uid==$cur_id&&($reg_lid['lid']==3)){
                    /* Начисляем процент для lid=3*/
                $proc = 89; //Процентов за всё время
                $proc_d =0.89*$datediff; //Процентов в день
                $proc = ($amount+$referrals_amount)/100*$proc; // высчитываем процент от числа
                $proc_d = ($amount+$referrals_amount)/300*$proc_d; // высчитываем процент в день от числа
                  $amount_all = $referrals_amount + $proc_d;
                $amountWithPct_all = $amount + $referrals_amount + $proc; // суммируем число с процентами от этого числа
                $amountWithPct_d = $amount + $referrals_amount + $proc_d; // суммируем число с процентами в день от этого числа
                round ($amountWithPct_all); // округляем
                round ($amountWithPct_d); // округляем
             
            echo "Дата оплаты: {$start}<br/>";
              echo "Прошло дней: {$datediff}<br/>";
              echo "Внесено: {$amount} ₽<br/>";
            echo "Бонусы: {$referrals_amount} ₽<br/>";
            echo "Проценты: {$proc_d} ₽<br/>";
            echo "Бонусы + проценты: $amount_all ₽<br/>";
            echo "Cумма на конец периода: $amountWithPct_all ₽<br/><br/>";
    }
          else{
            }     
      }
        /* очищаем результаты выборки */
    mysqli_free_result($result);
    
    /* закрываем подключение */
    mysqli_close($link);
    ?>
     
Статус темы:
Закрыта.