ここで、次の質問とクエリの目的をよりよく説明しようと思います。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を使用すると、パフォーマンスが急激に低下します(たとえば、カートページの場合、バスケット内の商品が増えると)。
ありがとう。