2

ここで、次の質問とクエリの目的をよりよく説明しようと思います。eコマース環境とデータベースについて話していると仮定しましょう。特に、products、orders、orders_dataの3つのテーブルがあります。ORDERSテーブルはすべての発注を処理し、サブテーブルはORDERS_DATAと呼ばれ、注文内に記録されたすべての製品を格納します。

テーブルの定義に従いますが、私の質問にはこれらの役に立たないフィールドはありません。

    ORDERS (*id*, date, totale, ...);
    ORDERS_DATA (id_order, id_product, ...);
    PRODUCTS (id, name, ...);

ORDERSの主キーはidですが、ORDERS_DATAのキーは(id_order、id_product)です。

クエリで実行したいのは、PRODUCT IDを指定して(製品ページまたはカートページを閲覧しているときにも)、ORDERS_DATAテーブルに基づいて提案された製品を取得することです。クエリは、これらの注文に含まれるすべてのid_productを返します。ここで、これらの製品の少なくとも1つは指定されたPRODUCTIDです

わかりやすくするために、例を報告します。ORDERS_DATAに次の行があると仮定します。

R1(1, 1); R2(1, 2); R3(1, 3); R4(2, 2), R5(2, 5); R6(3, 3);

製品ID=2の提案が必要です。クエリはIDを返します:1と3(R1とR3から-同じ注文IDを共有し、この注文には製品2-R2から-その製品もあります)と製品5のおかげで注文番号2。注文番号3は無視されます。

これは私が書いたクエリですが、パフォーマンスとスタイルの点で最高のものではないと確信しています。

SELECT 
    A.id_product, COUNT( A.id_product ) AS num
FROM  
    orders_data A, orders_data B
WHERE 
    A.id_order = B.id_order
    AND B.id_product IN  (*IDs-HERE*)
    AND A.id_product NOT IN (*IDs-HERE*)
GROUP BY A.id_product

すでにINNERJOIN構文を使用していますが、パフォーマンスに変化はありません。クエリは、IN句に1つの製品IDだけで0,0022秒かかります。複数の商品IDを使用すると、パフォーマンスが急激に低下します(たとえば、カートページの場合、バスケット内の商品が増えると)。

ありがとう。

4

1 に答える 1

0

JOINEXISTSテストに置き換えてみてください。

SELECT
   id_product,
   COUNT(1) As num
FROM
   orders_data As A
WHERE
   id_product NOT IN (*IDs HERE*)
And
   Exists
   (
      SELECT 1
      FROM orders_data As B
      WHERE B.id_order = A.id_order
      And B.id_product IN (*IDs HERE*)
   )
GROUP BY
   id_product
于 2012-11-26T15:02:04.270 に答える