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

Статус
В этой теме нельзя размещать новые ответы.

Newageman

Создатель
Регистрация
3 Янв 2012
Сообщения
45
Реакции
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. Знаний совсем не хватает. Заранее большое спасибо.
 
Последнее редактирование:

kmrd

Создатель
Регистрация
23 Ноя 2016
Сообщения
21
Реакции
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 Янв 2012
Сообщения
45
Реакции
4
Средствами 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, но и так тоже пойдёт.
Спасибо. Как я понимаю с помощью этого запроса мы связали значения всех 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?
 
Последнее редактирование:

Minor

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

Newageman

Создатель
Регистрация
3 Янв 2012
Сообщения
45
Реакции
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);
?>
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху