我正在为我的网站编写高级搜索代码。我想根据 4 个参数对从 MySQL 数据库中获取的记录进行排序 - 客户名称、公司名称、订单数量和总订单价值。搜索工作非常好,并且还根据客户名称和公司名称对值进行排序。但问题是我无法根据订单数量和总订单价值对行进行排序。
先看看我的任务的界面——
我正在使用 4 个表格来完成这个搜索引擎的排序。以下是表格:
- 地址簿表:
- 客户表:
- 订单表:
- 订单产品表:
这是我用于搜索和排序的 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 来计算订单数量和总订单价值,那么结果将不准确。但是如果我在内部查询中计算这些,那么我不明白如何根据这两个参数进行排序。
安迪的帮助将不胜感激。
提前致谢。