2016-03-25 7 views
1

ログインしたユーザーがテーブル内で注文を表示するためにordersページを作成しました。私の 'SELECT'ステートメントは最初は重複した結果を表示していましたが、それを修正しようとした後、ユーザーごとに1つのオーダーしか表示していません。重複結果または1行のみを取得するSELECTステートメント

私は注文の2つのテーブルordersordersdetailを持っています。

1つの注文または重複ではなく、すべてのユーザー注文を表示するにはどうすればよいですか?

<?php 
//CUSTOMER 
$user = $_SESSION['email']; 
$get_c = "SELECT * FROM customer WHERE email='$user'"; 
$run_c = $db->query($get_c); 
$row_c = $run_c->fetch(PDO::FETCH_BOTH); 
$c_id = $row_c['id']; 

//ORDERS 
$get_o = "SELECT * FROM orders WHERE user_id='$c_id'"; 
$run_o = $db->query($get_o); 
$row_o = $run_o->fetch(PDO::FETCH_BOTH); 
$o_id = $row_o['id'];/***/ 
$o_name = $row_o['name']; 
$o_status = $row_o['status']; 
$o_userid = $row_o['user_id']; 
$o_date = $row_o['date']; 

//ORDER DETEAILS 
$get_order = "SELECT * FROM ordersdetail WHERE ordersid='$o_id' "; 
$run_order = $db->query($get_order); 

while($row_o = $run_order->fetch(PDO::FETCH_BOTH)){ 
$order_id = $row_o['ordersid']; 
$o_price = $row_o['price']; 
$pro_id = $row_o['productid']; 
$o_qty = $row_o['quantity']; 

//PRODUCT DETAILS 
$get_pro = "SELECT * FROM items WHERE id='$pro_id'"; 
$run_pro = $db->query($get_pro); 
$row_pro = $run_pro->fetch(PDO::FETCH_BOTH); 
$pro_image = $row_pro['photo']; 
$pro_title = $row_pro['title']; 
?> 

<tr align="center"> 
    <td><?php echo $o_id;?></td> 
    <td> 
    <?php echo $pro_title;?> <b> 
    <img src="images/<?php echo $pro_image;?>" width="50" height="50" /> 
    </td> 
    <td><?php echo $o_price;?></td> 
    <td><?php echo $o_qty;?></td> 
</tr> 
<?php } ?> 
</table> 

ORDERSDETAIL TABLE

`ordersdetail` (
`id` int(10) NOT NULL, 
`productid` int(11) NOT NULL, 
`ordersid` int(11) NOT NULL, 
`price` float NOT NULL, 
`quantity` int(11) NOT NULL 
) ENGINE=InnoDB 

ORDERS表

`orders` (
`id` int(10) unsigned NOT NULL, 
`name` varchar(100) NOT NULL, 
`status` tinyint(1) NOT NULL, 
`user_id` int(11) NOT NULL, 
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE  CURRENT_TIMESTAMP 
) ENGINE=InnoDB 
+3

DB構造を知らなくても助けが手に入れません... – webeno

+0

私のテーブルをエクスポートしてコードを編集して、今度はgimmeを追加します – Mani

+0

@Maniはあなたのmysqlシェルにログインします ' mysql -u YOUR_USERNAME -p'と入力し、「use YOUR_DB_NAME」と入力します。表を表示するには 'show tables'と打ちます。この方法で、構造体をテキストでコピーして、単にあなたの質問に貼り付けることができます。表の構造を表示するには、単に 'desc YOUR_TABLE_NAME'を実行します。 – James111

答えて

1

あり、クエリの全体の多くがあります、と私はあなたがそれらのすべてを必要と確信していません。

特定の顧客の注文を取得するには、結合操作を使用できます。たとえば:

SELECT o.id 
    , o.name 
    , o.user_id 
    , o.date 
    FROM orders o 
    JOIN customer c 
    ON c.id = o.user_id 
WHERE c.email = ?  -- '$user' 
ORDER BY o.date DESC, o.id DESC 

私は結果がより確定にするORDER BY句を追加します。これがなければ、MySQLは任意の順序で行を返すことができます。

オーダーには1つまたは複数のオーダーラインが含まれるため、ordersdetailsテーブルへのJOINを実行すると、返される各ローに「複製」オーダー情報が生成されます。

ここでは設計する選択肢があります。

1)私たちはordersクエリを実行し、ループ内の各行をフェッチします。フェッチする行ごとにordersdetailsテーブルから別のクエリを実行し、その行を処理してその行項目を探します。次の注文をフェッチして、注文ループを再度元に戻します。上記の外側のループのクエリと内側のループのこのようなクエリ。

SELECT o.id   AS o_id 
    , o.name  AS o_name 
    , o.user_id  AS o_user_id 
    , o.date  AS o_date 
    , l.id   AS d_id 
    , l.price  AS d_price 
    , l.productid AS d_productid 
    , l.quantity AS d_quantity 
    FROM orders o 
    JOIN customer c 
    ON c.id = o.user_id 
    LEFT 
    JOIN orderdetails l 
    ON l.ordersid = o.id 
WHERE c.email = ?  -- '$user' 
ORDER BY o.date DESC, o.id DESC, l.id DESC 

そして、それを処理:

SELECT l.ordersid 
    , l.price 
    , l.productid 
    , l.quantity 
    FROM orderdetails l 
WHERE l.ordersid = ? -- o.id 

他の大きな設計上の選択肢は次のように、ただ一つの大きなクエリを実行することです。これには余分なコードが必要になります。

フェッチする行のo_id orderidが前の行のo_idと等しい場合、同じ注文を処理していることがわかります。私たちは、ページ上でこのような結果に何かを返している場合は...

order#55 
date: 3/25/2016 

     product   price qty status 
     -------------- -------- --- ----------   
    1) snugglyfluffy  14.99 12 shipped 
    2) bitersmiter   99.95 1 fulfillment 
    3) camelmammal  14,358.00 7 backordered 

order#42 
date: 12/12/2012 

     product   price qty status 
     -------------- -------- --- -------   
    1) hitchhikersguide 12.50 1 shipped 
    2) towel    4.00 1 shipped 

その後、我々は(の注文IDの違いを確認することで、各注文から「最初の行」を特定する必要があると思います現在の行と前の行を比較しています。新しいオーダーを取得すると、オーダーヘッダーの部分を処理してから、ラインアイテムを処理します。同じオーダーの次の行では、

+0

あなたの助けてくれてありがとう、最初の解決策が働いていますが、何らかの理由で結果が3倍になっています。何か案は? – Mani

+0

実際には私はあなたの2番目のクエリを試して、それはより良い動作します。どうもありがとう。 – Mani

+0

Customerテーブルで 'email'は一意ですか?私はあなたのコードとは別にSQL文を開発、テスト、デバッグすることをお勧めします。クエリが期待どおりの結果を返すことを確認してください。これらのクエリをコードに導入すると、プログラムから予期しない結果が得られている場合は、問題がクエリ内にあるのかコード内にあるのか不思議ではありません。 – spencer7593

関連する問題