Что-то не так в цикле while?

У меня есть таблица store_credits_orders

введите описание изображения здесь

и таблица заказов.

введите описание изображения здесь

Результат, который я хочу, похож на этот, но на основе Store Credit Order Date and Time Store Order Date and Time :

введите описание изображения здесь

Код, который я пробовал до сих пор:

 <?php $table = ''; $queryToGetStoreCredit = "SELECT * FROM store_credits_orders WHERE SCO_CustEmailAdd = '".$_SESSION["Customer"]["email"]."'"; $validate->Query($queryToGetStoreCredit); if ($validate->NumRows() >= 1) { while ($rows_sco = $validate->FetchAllDatas()) { $used = $i = 0; $table .= '<tr>'; $table .= '<td>'.$rows_sco["SCO_OrderCode"].'</td>'; $table .= '<td>--</td>'; $table .= '<td>'.$rows_sco["SCO_OrderDate"].'</td>'; $table .= '<td>--</td>'; $table .= '<td>'.$rows_sco["SCO_Purchase_Amount"].'</td>'; $table .= '<td>'.$rows_sco["SCO_Credit_Alloted"].'</td>'; $table .= '<td>'.$used.'</td>'; $table .= '<td>'.( $rows_sco["SCO_Credit_Alloted"] - $used ).'</td>'; $table .= '</tr>'; $validate2 = new Validation(); $queryToGetOrder = "SELECT * FROM orders WHERE CustEmailAdd = '".$rows_sco["SCO_CustEmailAdd"]."'"; $validate2->Query($queryToGetOrder); while ($row = $validate2->FetchAllDatas()) { $table .= '<tr>'; $table .= '<td>--</td>'; $table .= '<td>'.$row["OrderCode"].'</td>'; $table .= '<td>--</td>'; $table .= '<td>'.$row["OrderDate"].'</td>'; $table .= '<td>--</td>'; $table .= '<td>--</td>'; $table .= '<td>'.$row["AppliedCredits"].'</td>'; $table .= '<td>'.($rows_sco["SCO_Credit_Alloted"] - $row["AppliedCredits"]).'</td>'; $table .= '</tr>'; } } } ?> 

То, что я хочу достичь, когда есть покупка store_credits, информация будет вставлена ​​в таблицу store_credits_orders . Теперь, когда тот же пользователь приходит, размещает заказ и выкупает store_credits (меньше, чем у него в своей учетной записи), в базе данных не будет обновления, кроме вставки в таблицу заказов.

Но когда пользователь входит в систему, он должен уметь видеть, когда он приобрел store_credits и / или когда он выкупил store_credits. Все эти события должны быть заказаны в зависимости от того, какое событие произойдет раньше, независимо от покупки или выкупа.

Я разговаривал с пользователем user3514160, и у меня была ясность, что он хочет. В основном данные вставляются правильно. Единственное, что он хочет – это показать данные правильно.

Ваш запрос должен выглядеть так:

 (SELECT SCO_Id, SCO_OrderCode, SCO_CustEmailAdd, SCO_Purchase_Amount, SCO_Credit_Alloted, SCO_OrderDate, SCO_OrderIP, null AS OrderId, null AS OrderCode, null AS CustEmailAdd, null AS AppliedCredits, null AS OrderDate, 'store_credits_orders' AS tableName FROM `store_credits_orders` AS credits_orders WHERE `SCO_CustEmailAdd` = '".$_SESSION["Customer"]["email"]."') UNION (SELECT OrderId, OrderCode, CustEmailAdd, AppliedCredits, OrderDate null AS SCO_Id, null AS SCO_OrderCode, null AS SCO_CustEmailAdd, null AS SCO_Purchase_Amount, null AS SCO_Credit_Alloted, OrderDate AS SCO_OrderDate, null AS SCO_OrderIP, 'store_orders' AS tableName FROM `store_orders` AS orders WHERE `SCO_CustEmailAdd` = '".$_SESSION["Customer"]["email"]."') ORDER BY `SCO_OrderDate` ASC 

Это необходимо для получения всех строк в одном результате. Мы выполняем это с помощью MySQL UNION .

UNION требует, чтобы обе таблицы имели одинаковое количество столбцов с одинаковыми именами. Вот почему мы добавляем пустые столбцы с null AS columnName .

И PHP с запросом

 <?php $table = '<table>'; // Query to get all rows from both tables $queryToGetStoreCredit = "(SELECT SCO_Id, SCO_OrderCode, SCO_CustEmailAdd, SCO_Purchase_Amount, SCO_Credit_Alloted, SCO_OrderDate, SCO_OrderIP, null AS OrderId, null AS OrderCode, null AS CustEmailAdd, null AS AppliedCredits, null AS OrderDate, 'store_credits_orders' AS tableName FROM `store_credits_orders` AS credits_orders WHERE `SCO_CustEmailAdd` = '".$_SESSION["Customer"]["email"]."') UNION (SELECT OrderId, OrderCode, CustEmailAdd, AppliedCredits, OrderDate null AS SCO_Id, null AS SCO_OrderCode, null AS SCO_CustEmailAdd, null AS SCO_Purchase_Amount, null AS SCO_Credit_Alloted, OrderDate AS SCO_OrderDate, null AS SCO_OrderIP, 'store_orders' AS tableName FROM `store_orders` AS orders WHERE `SCO_CustEmailAdd` = '".$_SESSION["Customer"]["email"]."') ORDER BY `SCO_OrderDate` ASC"; $validate->Query($queryToGetStoreCredit); if ($validate->NumRows() >= 1) { // Starting balance. This could be some other number, for example if viewing some certain period of orders etc. $balance = 0; while ($row = $validate->FetchAllDatas()) { // Add to balance if($row['tableName'] == 'store_credits_orders' && (int)$row['SCO_Credit_Alloted'] > 0){ $balance += (int)$row['SCO_Credit_Alloted'] } // Remove from balance else if($row['tableName'] == 'store_orders' && (int)$row['AppliedCredits'] > 0){ $balance -= (int)$row['AppliedCredits']; } $table .= '<tr>'; $table .= '<td>'.$row["SCO_OrderCode"].'</td>'; $table .= '<td>'.$row["OrderCode"].'</td>'; $table .= '<td>'.(($row['tableName'] == 'store_credits_orders') ? $row["SCO_OrderDate"] : '').'</td>'; $table .= '<td>'.$row["OrderDate"].'</td>'; $table .= '<td>'.$row["SCO_Purchase_Amount"].'</td>'; $table .= '<td>'.$row["SCO_Credit_Alloted"].'</td>'; $table .= '<td>'.$row["AppliedCredits"].'</td>'; $table .= '<td>'.$balance.'</td>'; $table .= '</tr>'; } } $table .= '</table>'; echo $table; ?> 

Дайте мне знать, если есть какие-то проблемы.