0

これらの 2 つのテーブルCARTとがありORDERSます。顧客が注文したすべての製品をグループ化して表示/取得したいのですが、ORDER_DATEこれらの 2 つのテーブルを結合して、どのようにこれを行うことができますか? または、正しいコード、スクリプト、または構文は何ですか..これは1:nの関係です.顧客がORDERED BY order_date..

CARTテーブル:

  • cart_id
  • 製品番号
  • ユーザーID
  • prod_name
  • 価格
  • 画像

ORDERテーブル:

  • order_id
  • cart_id
  • ユーザーID
  • 合計
  • 顧客名
  • 注文日
4

2 に答える 2

4

注文日別に注文された (グループ化されていない)すべてのアイテムを一覧表示する場合は、次のようになります。

SELECT * 
FROM `order` 
LEFT JOIN cart ON cart.cart_id=`order`.cart_id 
ORDER BY order_date ASC

また :

SELECT * 
FROM cart 
LEFT JOIN `order` ON `order`.cart_id=cart.cart_id
ORDER BY order_date ASC

構造から、cart には複数の注文を含めることができるように見えますが (order にはそれ以上のカートを含めることはできません)、ここで、(これらの 2 つのテーブルの) 1:n の関係であるか、1:1 の関係であるか (この場合、cart_id は必要なく、代わりに order_id を両方のテーブルのリンク要素として使用できます)

多少「グループ化」したい場合は、詳細を犠牲にする必要があります(グループ化する必要があります)。すべての注文の合計値を表示したい場合は、グループ化が便利ですが、そうすると、合計値のみが表示され、各注文のアイテムは表示されません (行ごとの表示ではありません)。

編集:
[すみません、忘れていました.. 1:n の関係です.. また、各顧客から注文された商品を表示する必要があります.. それは可能ですか? :) ]

その場合、マスターテーブルが「注文」であると仮定すると、構造はあまり健全に見えません。詳細を含むテーブルには、マスターテーブルへの参照が含まれている必要があります。

カート表:

  • cart_id
  • order_id (追加)
  • 製品番号
  • ユーザーID
  • prod_name
  • 価格
  • 画像

注文テーブル:

  • order_id
  • cart_id (削除済み)
  • ユーザーID
  • 合計
  • 顧客名
  • 注文日

繰り返しますが、あなたの質問はあまり明確ではありません。ユーザーが購入したアイテムをアイテムごとにグループ化して表示しますか (つまり、ユーザーが今日鉛筆​​を明日購入し、別の鉛筆を明後日に購入した場合、次のような 2 行の結果が表示されます。

item   | qty
-------+----
pencil | 2  
rubber | 1

次に使用します:

SELECT `order`.*, product_id, product_name, SUM(quantity) AS qty 
FROM `order` 
LEFT JOIN cart ON cart.order_id=`order`.order_id
GROUP BY product_id
ORDER BY product_name
于 2013-03-15T18:43:46.407 に答える
3

フアン、これは本当に長くなっていて、Stack Overflowサイトがこの種のダイアログを対象としているかどうかはわかりませんが、もう一度説明しようと思います。ここに投稿するコードが単純になるように、テーブルを単純化します。

CREATE TABLE orders (
    orderID int unsigned not null auto_increment,
    user int unsigned not null,
    PRIMARY KEY (orderID)
);

CREATE TABLE orderitems (
    oiID int unsigned not null auto_increment,
    order int unsigned not null,
    item int unsigned not null,
    PRIMARY KEY (oiID)
);

上記は、ユーザーのテーブル(ユーザーの名前と電子メールなど)とアイテムのテーブル(アイテム名とアイテムの価格)があることを前提としています。

また、(間違っていますが、簡単にするために)私のシナリオでは、私が販売しているアイテムを1つ以上購入したいと思う人は誰もいないし、3つ以上のアイテムを購入したいと思う人もいないと思います。同時に。

次に、注文時にユーザーがログインする必要があるため、HTML入力フォームは十分に単純になります(したがって、ユーザーIDはすでにわかっています-そしてそれは私のphp $ _SESSION ['userID']グローバル変数に保持されます)、注文は常に動的ですユーザーが[チェックアウト]ボタン(フォームを送信)をクリックしたときに割り当てられるため、ユーザーが入力する必要があるのはアイテムIDだけです(たとえば、ドロップダウンリストから選択します)。

非常にシンプルなエントリーフォームは次のとおりです。

<form action='orderit.php' method='post'>
    <select name='item[]'>
        <option value='' selected='selected'>Pick an item from the list!</option>
        <option value='1'>Knife</option>
        <option value='2'>Spoon</option>
        <option value='3'>Lava lamp</option>
        <option value='4'>HB pencil</option>
    </select><br/>
    <select name='item[]'>
        <option value='' selected='selected'>Pick an item from the list!</option>
        <option value='1'>Knife</option>
        <option value='2'>Spoon</option>
        <option value='3'>Lava lamp</option>
        <option value='4'>HB pencil</option>
    </select><br/>
    <select name='item[]'>
        <option value='' selected='selected'>Pick an item from the list!</option>
        <option value='1'>Knife</option>
        <option value='2'>Spoon</option>
        <option value='3'>Lava lamp</option>
        <option value='4'>HB pencil</option>
    </select><br/><br/>
    <input type='submit' value=' Checkout ' name='do'/>
</form>

上記から、ユーザーがすべてのデータをチェックアウトするときよりもわかります(つまり、顧客が行った選択actionはに設定されたに送信されorderit.phpます。ユーザーが有効な情報を送信していることを確認する必要はありません。最新のテクノロジー(msqli)を使用せず、代わりに非推奨のmysqlルーチンを使用しています。

だからここにそれは続きます:

<?php
     //here you will have your database opened, session initiated and so on
     // $db contains the database connection handler
     // $_POST['userID'] contains valid user's id

     if (isset($_POST['item']) && count($_POST['item'])>0) {
         //they ordered something we can create the order
         $q=mysql_query("INSERT INTO orders SET user='".mysql_real_escape_string($_SESSION['userID'])."'",$db);
         if (!$q)
             die("An error while creating new order");
         $orderID=mysql_insert_id($db); //fetch the just-now created order's ID
         foreach($_POST['item'] as $item) { //go through all the ordered items
            $q=mysql_query("INSERT INTO orderitems SET order='$orderID', item='".abs((int) $item)."'");
            if (!$q)
                die("Couldn't save item $item of order #$orderID");
         }
         print "Your order was saved successfuly!";
     } else
         die("This is an empty order");
?>

そしてそれがすべてです。

現在、このコードを頭のてっぺんから書いているので、タイプミスやその他の種類のエラーが発生する可能性があることに注意してください。コードの実用的な部分としてではなく、おおよそのガイドとしてそれをとってください。

于 2013-03-16T18:28:08.557 に答える