2016-11-22 9 views
0

MySQLの場合は全く新しいです。私はデータベースからのレポートを得るための最良のソリューションを探しています。ここでMySQLのクエリデータベース

詳細は以下のとおりです。

CUSTOMER_ORDERからorder_idcustomer_idorder_nameorder_priceorder_store_id

Customer_details - customer_idcustomer_namecustomer_emp_id

Customer_order_itemsからorder_idcustomer_idproduct_name

私はCustomer_order_items、 CUSTOMER_ORDER customer_detailsからすべての詳細を取得し、だから私はだったorder_store_id

に固有のデータを与えることによって、結果に表示しようとしています次のように試してみてください:

SELECT d.customer_name, d.company_id, p.store_id, p.order_id, a.product_id, a.service_id 
FROM customer_master d 
JOIN customer_orders p ON d.customer_id = p.customer_id 
JOIN customer_order_items a ON a.customer_id = d.customer_id 
WHERE p.order_store_id = "000020" 

私は結果が奇妙ですすべての二重、三重値を得る。

正しい結果が得られるようにするにはどうすればよいですか?

私に教えてください!

答えて

0

あなたはLEFTは左表のすべての行を選択する力を、JOIN、JOIN条件

にLEFTを追加する必要がありますし、RIGHTテーブル内の対応する行(の条件のJOIN)。

SELECT d.customer_name, d.company_id, p.store_id, p.order_id, a.product_id, a.service_id 
FROM customer_master d 
LEFT JOIN customer_orders p ON d.customer_id = p.customer_id 
LEFT JOIN customer_order_items a ON a.customer_id = d.customer_id 
WHERE p.order_store_id = "000020" 
+0

違いがありますか? – Swetha

+0

はい、LEFT JOINは、JOINの左側の表の行と、JOINの右側の表の対応する行を選択します。 – McNets

+0

LEFTを使用すると、phpmyadminはフリーズします。 – Swetha

0

私は私が複製することができると思いますが、受注とORDER_ITEMS間の順序番号のリンクを持っていると仮定すると(なぜあなたは注文品目レベルでの顧客IDを持っているでしょうか?)あなたのクエリが間違っていると、あなたのDBの設計が間違っていると言うでしょうこの

ariaDB [sandbox]> select * from customers; 
+------+------+ 
| id | name | 
+------+------+ 
| 1 | John | 
| 2 | Jane | 
+------+------+ 
2 rows in set (0.00 sec) 

MariaDB [sandbox]> select * from orders; 
+-------------+---------+------------+------------+ 
| ordernumber | cust_id | orderdate | shipdate | 
+-------------+---------+------------+------------+ 
|   1 |  1 | 2016-01-01 | 2016-02-01 | 
|   2 |  1 | 2016-02-01 | NULL  | 
+-------------+---------+------------+------------+ 
2 rows in set (0.00 sec) 

MariaDB [sandbox]> select * from order_details; 
+------+-------------+-----------------+-------------+---------+ 
| id | ordernumber | quantityordered | quotedprice | cust_id | 
+------+-------------+-----------------+-------------+---------+ 
| 1 |   1 |    10 |   10 |  1 | 
| 2 |   1 |    20 |   20 |  1 | 
+------+-------------+-----------------+-------------+---------+ 
2 rows in set (0.00 sec) 

ようなあなたの問題は、私はあなたのクエリを使用して、私の結果で2行を取得するために期待されるこのデータ(私のデータのために改正された)

MariaDB [sandbox]> select c.id,c.name,o.ordernumber,o.orderdate,od.quantityordered 
    -> from customers c 
    -> join orders o on o.cust_id = c.id 
    -> join order_details od on od.cust_id = c.id 
    -> order by ordernumber; 

を考えるしかし、実際には、私は4行を取得します

+------+------+-------------+------------+-----------------+ 
| id | name | ordernumber | orderdate | quantityordered | 
+------+------+-------------+------------+-----------------+ 
| 1 | John |   1 | 2016-01-01 |    20 | 
| 1 | John |   1 | 2016-01-01 |    10 | 
| 1 | John |   2 | 2016-02-01 |    10 | 
| 1 | John |   2 | 2016-02-01 |    20 | 
+------+------+-------------+------------+-----------------+ 
4 rows in set (0.00 sec) 

カスタマーIDの注文明細に参加しているためです。 より合理的なアプローチは、私が期待する3行を与える

ariaDB [sandbox]> select c.id,c.name,o.ordernumber,o.orderdate,od.quantityordered 
    -> from customers c 
    -> join orders o on o.cust_id = c.id 
    -> left join order_details od on od.ordernumber = o.ordernumber 
    -> order by ordernumber; 
+------+------+-------------+------------+-----------------+ 
| id | name | ordernumber | orderdate | quantityordered | 
+------+------+-------------+------------+-----------------+ 
| 1 | John |   1 | 2016-01-01 |    20 | 
| 1 | John |   1 | 2016-01-01 |    10 | 
| 1 | John |   2 | 2016-02-01 |   NULL | 
+------+------+-------------+------------+-----------------+ 

ORDER_DETAILSは、注文番号で注文に参加していることに合流する(左を使用して順序は何のORDER_DETAILSを持っていないだけの場合には参加)をカスケード接続することです。

+0

これはまさに起きています。私は何をすべきか? – Swetha

+0

私がこれを行う場合、最後のクエリ(あなたのデータのために改訂) –

+0

を試してください。それはPHPMYADMINをフリーズしています.. – Swetha

関連する問題