0

解決策が見つからないコードでしばらく立ち往生しています。たくさんのオプションを試しましたが、どれもうまくいかないようです。

私はすべての顧客と一緒にテーブルを持っています。名前、郵便番号などを表示していますが、同じテーブルに未処理の注文の量も表示したいと考えています。

これらのテーブルmysqlテーブルを取得しました:

表1

テーブル名: 顧客

列: customer_ID、郵便番号、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などのような結果が得られます。

すべての顧客を一度に適切な量の注文を表示することはできないようです..

助けていただければ幸いです。

4

2 に答える 2

1

いくつかのアプローチがあります。

order1つは、テーブルにOUTERJOINを実行することです。ここでの秘訣は、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

もう1つのアプローチは、インラインビューを使用してすべての顧客の未処理の注文数を取得し、それを顧客テーブルに結合することです...

 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

この質問には2つの部分があります。

  1. 注文が受け付けているかどうかはどうすればわかりますか?「ステータスID1〜6」に依存することは、通常、正しいアプローチではありません。別のステータスを追加するとどうなりますか?現在、「オープン」は「ステータスID 1〜6および8?」を意味します。これはすぐに手に負えなくなることがわかります。より良いアプローチはis_open、テーブルにフラグを追加することですstatus(おそらくテーブルにorderもフラグを追加しますが、これは歴史的な目的のためであり、アプリケーションでは必要ない場合があります)。

  2. 各顧客の未処理の注文の数を取得するにはどうすればよいですか?この質問への答えは前の解決策によって異なりますが、これでうまくいくはずです(TINYINT(1)であるステータステーブルにis_open列を追加し、各注文ステータスにフラグを正しく設定したと仮定します) )::

    SELECT status.status_ID、order.status_ID、order.customer_ID、customer.customer_ID、customer.name、customer.postcode、customer.since、COUNT(DISTINCT IF(status.is_open = 1、order.order_ID、NULL))AS open_orders FROM customer LEFT JOIN order ON(order.customer_ID = customer.customer_ID)LEFT JOIN status ON(status.status_ID = order.status_ID)GROUP BY customer.customer_ID

LEFT JOINの代わりにを使用していることに注意しINNER JOINてください。これにより、アクティブな注文の有無にかかわらず、顧客が顧客リストに表示されます。

于 2013-01-08T14:55:40.443 に答える