2

このDBスキーマを見てください。

DBスキーマ

ユーザーは製品を注文できます。すべての注文について、注文テーブルに新しいレコードを追加し、ユーザーが注文した単一の製品(およびフィルピースフィールド)のorders-products N:Mテーブルに新しいレコードを追加します。ただし、ユーザーが注文を作成するときは、すべての製品のリストを表示し、任意の製品の注文数量をピースフィールドに入力する必要があります。

通常、それを行うには、2つのクエリを使用します。
最初のクエリは、productsテーブル内のすべての製品を取得します。

SELECT * FROM products;

2番目のクエリは、orders-productsテーブルで注文された商品を、 orders-idorderFKでフィルタリングして取得します。

SELECT orders_idorder AS idorder, products_idproduct AS idproduct, pieces FROM orders_products WHERE orders_idorder=1;

次に、結果を1つの配列にマージし、それを使用して、製品ごとに注文された製品の完全なリストを表示します。最終結果は次のようになります。

+ --------- + ----------- + -------------- + ------- + ---- ---- +
| idorder | idproduct | 説明| 価格| ピース|
+ --------- + ----------- + -------------- + ------- + ---- ---- +
| 1 | 1 | 製品1| 10.20 | 2 |
| 1 | 2 | 製品22| 11.00 | NULL |
| 1 | 3 | 製品333| 19.22 | NULL |
| 1 | 4 | 製品4444| 9.20 | NULL |
+ --------- + ----------- + -------------- + ------- + ---- ---- +

:上記の例では、productsテーブルに4つのレコードがあり orders -productsテーブルに1つのレコードしかありません(idorder = 1、idproduct = 1、pieces = 2があります)。->ここで、クエリをテストするためのSQLダンプ
を 見つけることができます 2つのクエリから構築された配列をマージするのが最善の方法ですか?単一のクエリでそれを行うことができますか? パフォーマンスについてどう思いますか?




4

4 に答える 4

1

通常、データベースにマージを最適化させることは、コードでできることよりも優れています。通常、データベースはソートも優れています。

クエリをどのように構成するかは、目的の結果セットによって異なります。注文テーブルに表示されるかどうかに関係なくすべての製品が必要な場合は、OUTER JOIN を使用します。それ以外の場合、INNER JOIN は注文されたことのない製品を除外します。

いくつかのサンプル データについて希望する結果を提供していただければ、クエリのお手伝いができるかもしれませんが、まずはご自身で試してみてください。

set @searchOrderId = 1;
select ifnull(op.orders_idorder, @searchOrderId) AS idOrder,
    p.idproduct,
    p.description,
    p.price,
    op.pieces
from products p
left join orders_products op on op.products_idproduct = p.idproduct
where ifnull(op.orders_idorder, @searchOrderId) = @searchOrderId ;

テストのために遊んでいたSQL Fiddle 。

于 2013-01-15T00:59:59.143 に答える
0

なるほど、Products テーブルから Orders_Products への LEFT JOIN が必要でしたね。これにより、探している結果が得られます。

于 2013-01-16T22:21:16.687 に答える
0

一般的には、2 つのクエリを実行して結果をマージするよりも、1 つのクエリを実行して結果を取得する方がパフォーマンスが良いと思います。提供された情報を踏まえて、実行のための理想的な計画が何であるかを言うことは不可能です. テーブルのサイズ、アーキテクチャなどが影響します。

1 つの注文からすべての製品を取得するには、次を試してください。

select
    o.idorder,
    p.idproduct,
    p.description,
    p.price,
    op.pieces
from
    orders o
    inner join orders_products op
        on o.idorder = op.orders_idorder
    inner join products p
        on op.products_idproduct = p.idproduct
where
    o.idorder = 1
于 2013-01-15T13:09:50.913 に答える
0

テーブルを結合することにより、単一のクエリを使用して情報を取得できます。それはあなたが悩んでいることですか?

于 2013-01-15T00:45:02.250 に答える