私は自分のサイトの高度な検索コードを書いています。顧客名、会社名、注文数量、合計注文額の 4 つのパラメーターに基づいて、MySQL データベースから取得したレコードを並べ替えたいと考えています。検索はうまく機能しており、顧客名と会社名に基づく値のソートもうまく機能しています。しかし、問題は、注文数量と合計注文額に基づいて行を並べ替えることができないことです。
最初に私のタスクのインターフェースを見てください -
この検索エンジンを並べ替えで実現するために、4 つのテーブルを使用しています。ここにテーブルがあります:
- address_book テーブル:
- 顧客テーブル:
- 注文表:
- orders_products テーブル:
検索と並べ替えを行うための PHP コードは次のとおりです。
<?php
require_once 'includes/config.php';
?>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
<link rel="stylesheet" type="text/css"
href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/ui-lightness/jquery-ui.css">
<script type="text/javascript">
$(document).ready(function () {
//$("#datepicker").datepicker();
$("#txtstartdate").datepicker({
dateFormat: "yy-mm-dd",
});
$("#txtenddate").datepicker({
dateFormat: "yy-mm-dd",
});
});
</script>
<div>
<form name="frm1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<table width="100%" border="0" align="center">
<tr>
<th>Start Date:</th>
<td><input type="text" name="txtstartdate" id="txtstartdate"
value="<?php if (isset($_POST['btnsearch'])) {
echo $_POST['txtstartdate'];
}
else {
echo '';
} ?>"/></td>
</tr>
<tr>
<th>End Date:</th>
<td><input type="text" name="txtenddate" id="txtenddate"
value="<?php if (isset($_POST['btnsearch'])) {
echo $_POST['txtenddate'];
}
else {
echo '';
} ?>"/></td>
</tr>
<tr>
<th>Customer Name:</th>
<td><input type="text" name="txtcustomername" id="txtcustomername"
value="<?php if (isset($_POST['btnsearch'])) {
echo $_POST['txtcustomername'];
}
else {
echo '';
} ?>"/></td>
</tr>
<tr>
<th>Company Name:</th>
<td><input type="text" name="txtcompanyname" id="txtcompanyname"
value="<?php if (isset($_POST['btnsearch'])) {
echo $_POST['txtcompanyname'];
}
else {
echo '';
} ?>"/></td>
</tr>
<tr>
<th>Sorting:</th>
<td><select name="selsorting" id="selsorting">
<option
value='customer_name' <?php if (isset($_POST['btnsearch']) && $_POST['selsorting'] == 'customer_name') {
echo "selected='selected'";
} ?>>
Customer Name
</option>
<option
value="company_name" <?php if (isset($_POST['btnsearch']) && $_POST['selsorting'] == 'company_name') {
echo "selected='selected'";
} ?>>
Company Name
</option>
<option
value="order_quantity" <?php if (isset($_POST['btnsearch']) && $_POST['selsorting'] == 'order_quantity') {
echo "selected='selected'";
} ?>>
Order Quantity
</option>
<option
value="total_order_value" <?php if (isset($_POST['btnsearch']) && $_POST['selsorting'] == 'total_order_value') {
echo "selected='selected'";
} ?>>
Total Order Value
</option>
</select></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" name="btnsearch" value="Search"/>
</tr>
</table>
</form>
</div>
<?php
if (isset($_POST['btnsearch'])) {
$where = array();
if (isset($_POST['txtstartdate']) && !empty($_POST['txtstartdate'])) {
$startdate = $_POST['txtstartdate'];
$where[] = " orders.date_purchased >= '$startdate' ";
}
if (isset($_POST['txtenddate']) && !empty($_POST['txtenddate'])) {
$enddate = $_POST['txtenddate'];
$where[] = " orders.date_purchased <= '$enddate' ";
}
if (isset($_POST['txtcustomername']) && !empty($_POST['txtcustomername'])) {
$customername = $_POST['txtcustomername'];
$where[] = " customers.customers_firstname LIKE '%$customername%' or customers.customers_lastname LIKE '%$customername%' ";
}
if (isset($_POST['txtcompanyname']) && !empty($_POST['txtcompanyname'])) {
$companyname = $_POST['txtcompanyname'];
$where[] = " address_book.entry_company LIKE '%$companyname%' ";
}
if (isset($_POST['selsorting'])) {
$sorting = $_POST['selsorting'];
$where[] = " 1 = 1 GROUP BY customers.customers_id ORDER BY $sorting ";
}
if (count($where) > 0) {
$query['where'] = " WHERE " . implode(" AND ", $where);
}
$sql = "SELECT customers.customers_id, CONCAT(customers.customers_firstname, ' ', customers.customers_lastname) AS `customer_name`, address_book.entry_company AS `company_name`, orders_products.final_price AS total_order_value
FROM customers
LEFT JOIN orders ON orders.customers_id = customers.customers_id
LEFT JOIN address_book ON address_book.customers_id = customers.customers_id
LEFT JOIN orders_products ON orders_products.orders_id = orders.orders_id " . $query['where'];
$rs = mysql_query($sql);
echo "<table width='100%' align='center' border='1' cellpadding='5' cellspacing='0'>";
echo "<tr><th>Customer ID</th><th>Customer Name</th><th>Company Name</th><th>Order Quantity</th><th>Order Total</th></tr>";
while ($row = mysql_fetch_array($rs)) {
$sql2 = "SELECT COUNT(*) AS 'quantity' FROM `orders` WHERE `customers_id` = " . $row['customers_id'];
$rs2 = mysql_query($sql2);
while ($row2 = mysql_fetch_array($rs2)) {
$sql3 = "SELECT SUM(`final_price`) AS 'total_order_value' FROM `orders_products` WHERE `orders_id` IN (SELECT `orders_id` FROM `orders` WHERE `customers_id` = " . $row['customers_id'] . ")";
$rs3 = mysql_query($sql3);
while ($row3 = mysql_fetch_array($rs3)) {
echo "<tr><td> " . $row['customers_id'] . "</td>";
echo "<td> " . $row['customer_name'] . "</td>";
echo "<td> " . $row['company_name'] . "</td>";
echo "<td> " . $row2['quantity'] . "</td>";
echo "<td> " . $row3['total_order_value'] . "</td></tr>";
}
}
}
echo "</table>";
}
?>
注文数量と合計注文額はメインの左結合クエリに含まれておらず、その場で生成されるため、並べ替えを行う方法がわかりません。メインの左結合クエリで注文数量と合計注文額を計算するために集計関数 COUNT と SUM を使用すると、結果が正確になりません。しかし、内部クエリでこれらを計算すると、これら 2 つのパラメーターに基づいて並べ替えを行う方法がわかりません。
Andy の助けをいただければ幸いです。
前もって感謝します。