0

我在一段无法找到解决方案的代码上停留了一段时间。尝试了一大堆选项,但似乎都不起作用。

我和我所有的顾客都有一张桌子。它显示了他们的姓名、邮政编码等。但我也想在同一张表中显示未结订单的数量。

我得到了这些表mysql表:

表格1

表名:客户

列:customer_ID、postcode、customer_since、customer_name

表 2

表名:状态

列:status_ID、status_name

表3

表名:订单

列:order_ID、customer_ID、status_ID

到目前为止,这是我的代码:

$sql = mysql_query ("SELECT customer.customer_ID, customer.postcode, customer.since, customer.name
FROM customer
ORDER BY customer.customer_ID desc  ");

echo '<table border="0" width="515"  >
      <tr>
    <td>
       <table cellspacing="0" cellpadding="0" border="0" width="515" id="table1" >
         <tr>
            <th width="60" align="center"><span class="tabledescription">Number:</span></td> //customernumber
        <th width="155" align="center"><span class="tabledescription">Name:</span></td> //customername
        <th width="100" align="center"><span class="tabledescription">Postcode:</span></td>//customerpostcode
        <th width="100" align="center"><span class="tabledescription">Orders open:</span></td>//amount of open orders
        <th width="100" align="center"><span class="tabledescription">Since:</span></td>//customer since
         </tr>
       </table>
    </td>
  </tr>
  <tr>
    <td>
       <div style="width:565px; height:322px; overflow:auto;">
         <table id="table1" cellspacing="0" cellpadding="0" border="0" width="575" >';

while($row = mysql_fetch_array($sql, MYSQL_ASSOC))
{
$id = $row['customer_ID'];
$name= $row['name'];
$postcode = $row['postcode'];
$status = $row['status'];
$since = $row['customer_since'];
$probleem = $row['probleem'];

$csince = date('d-m-Y', $since);

echo "<tr><td width=64><a style=' color: #009bce; text-decoration: none;' href='detailvieuwcustomer.php?id=".$id."'>".$id."</a></td>
        <td width=160>$name</td>
        <td width=105>$postcode</td>
        <td width=105>amount</td>
        <td width=105>$csince</td></tr>";

        }
echo ' </table>  
       </div>
    </td>
  </tr>
</table>'; 

到目前为止,这正在工作并展示我的 8 位客户。每个订单我有 7 种不同的状态类型。最后一个是它已交付,因此一个未打开。我做了这个代码:

$statusnumber = 7;


$sql1 = mysql_query("SELECT * FROM order WHERE customer_ID = '". $id . " ' AND status_ID != '". $statusnumber . "' ");

while($prow = mysql_fetch_array($sql1, MYSQL_ASSOC))
{

$openstatus = $prow['storing_ID'];

echo $openstatus;

这个向我展示了每个没有 status_ID 7 的订单。

现在我不知道如何计算 status_ID 为 1 - 6 的订单数量,并将未结订单数量放在正确客户后面的表格中。

我也尝试加入表格:

$sql = mysql_query("SELECT status.status_ID, order.status_ID, order.customer_ID, customer.customer_ID, customer.name, customer.postcode, customer.since
        FROM order
        INNER JOIN status on (status.status_ID = order.status_ID)
        INNER JOIN customer on (customer.customer_ID = order.customer_customer_ID)
        ORDER BY customer.customer_ID desc "); 

但是当我这样做时,它会多次向我展示我的所有客户,因为他从订单中获取 customer_ID,而我收到了大约 30 个订单。它给了我这样的结果:1,1,1,1,2,2,2,3,4,4,5,5,5,5 等。

我似乎无法用他们打开的正确数量的订单向所有客户显示 1 次..

帮助将不胜感激。

4

2 回答 2

1

有几种方法。

一种是对order表进行 OUTER JOIN。这里的技巧是 customer_ID 上的 GROUP BY,并检查status_ID列以返回 0 或 1,然后使用 SUM 组聚合函数将 0 和 1 相加:

 SELECT c.customer_ID
      , c.postcode
      , c.since
      , c.name
      , SUM(IF(s.status_ID != 7,1,0)) AS open_order_count
  FROM customer c
  LEFT
  JOIN order o
    ON o.customer_ID = c.customer_ID
  LEFT
  JOIN status s
    ON s.status_ID = o.status_ID
 GROUP
    BY c.customer_ID
     , c.postcode
     , c.since
     , c.name
 ORDER
    BY c.customer_ID DESC

注意:我们可以使用COUNT聚合来代替SUM,但我们需要为那些我们不想计算的行返回一个 NULL ......

      , COUNT(IF(s.status_ID != 7,1,NULL)) AS open_order_count

另一种方法(通常在大型集合上性能较差)是在 SELECT 列表中使用相关子查询:

 SELECT c.customer_ID
      , c.postcode
      , c.since
      , c.name
      , ( SELECT SUM(IF(s.status_ID != 7,1,0))
            FROM order o
            LEFT
            JOIN status s
              ON s.status_ID = o.status_ID
           WHERE o.customer_ID = c.customer_ID
        ) AS open_order_count
  FROM customer c
 ORDER BY c.customer_ID DESC

注意:为了性能,我可能会避免加入表格,并通过只查看表格来status快捷检查。(这实际上取决于查询中包含该表的原因;我只是认为这里不需要它。)例如status_IDorderstatus

 SELECT c.customer_ID
      , c.postcode
      , c.since
      , c.name
      , ( SELECT SUM(IF(o.status_ID != 7,1,0))
            FROM order o
           WHERE o.customer_ID = c.customer_ID
        ) AS open_order_count
  FROM customer c
 ORDER BY c.customer_ID DESC

另一种方法是使用内联视图获取所有客户的未结订单计数,然后将其连接到客户表......

 SELECT c.customer_ID
      , c.postcode
      , c.since
      , c.name
      , IFNULL(r.open_order_count,0) AS open_order_count
  FROM customer c
  LEFT
  JOIN (
         SELECT o.customer_ID
              , SUM(IF(o.status_ID != 7,1,0)) AS open_order_count
           FROM order o
          GROUP
             BY o.customer_ID
       ) r
    ON r.customer_ID = o.customer_ID
 ORDER BY c.customer_ID DESC
于 2013-01-08T15:10:20.540 回答
0

这个问题有两个部分:

  1. 我如何知道订单何时开放?依赖“状态 ID 1-6”通常不是正确的方法。当您添加另一个状态时会发生什么?现在“开放”意味着“状态 ID 1-6 和 8?” 你可以看到这很快就会失控。更好的方法是在表中添加一个is_open标志status(也可能在order表中,但这只是出于历史目的,在您的应用程序中可能不是必需的)。

  2. 如何获取每个客户的未结订单计数?那么这个问题的答案取决于你对前面的解决方案,但这应该可以解决问题(假设你已经在你的状态表中添加了一个 is_open 列,它是一个 TINYINT(1) 并在每个订单状态上正确设置了标志):

    从客户 LEFT JOIN 订单开启 (order.customer_ID = customer.customer_ID) LEFT JOIN 状态开启 (status.status_ID = order.status_ID) GROUP BY customer.customer_ID

请注意使用 aLEFT JOIN而不是 an INNER JOIN,这样无论有无活动订单,客户都会出现在您的客户列表中。

于 2013-01-08T14:55:40.443 回答