Sugerowane produkty do optymalizacji zapytań SQL

Spróbuję teraz lepiej wyjaśnić, co jest celem następującego pytania i zapytania. Załóżmy, że mówimy o środowisku e-commerce i bazie danych. Mamy między innymi trzy tabele: produkty, zamówienia i dane zamówienia. Tabela ORDERS będzie obsługiwać wszystkie złożone zamówienia i pod-tabelę, którą nazwiemy ORDERS_DATA, będzie przechowywać wszystkie produkty zarejestrowane w ramach zamówienia.

Zgodnie z definicją tabel, bez tych nieużytecznych pól dla mojego pytania:

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

Klucz podstawowy wŚWIĘCENIA jestID, podczas gdy w ORDERS_DATA kluczem jest(id_order, id_product).

To, co chciałbym zrobić z zapytaniem, to odzyskać dane, podającID PRODUKTU (podczas surfowania na stronie produktu lub stronie koszyka), sugerowane produkty oparte na tabeli ORDERS_DATA. Zapytanie zwróci wszystkie id_product, które znajdują się w tych zamówieniach, gdzie przynajmniej jeden z tych produktów jest podanyID PRODUKTU

Dla dobra semplicity podam przykład. Załóżmy, że mamy te WIERSZE w ORDERS_DATA:

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

Chcę sugestii dla id produktu = 2. Moje zapytanie zwróci identyfikatory: 1 i 3 (z R1 i R3 - mają ten sam identyfikator zamówienia i to zamówienie ma również produkt 2 - z R2 - btw swoje produkty) i produkt 5 dzięki numer zamówienia 2. Zamówienie nr 3 zostanie zignorowane.

To jest pytanie, które napisałem, ale jestem pewien, że nie jest najlepszy pod względem wydajności i stylu.

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

Używam już składni INNER JOIN, ale nic się nie zmienia w wydajności. Zapytanie przyjmuje 0,0022sec z tylko jednym identyfikatorem produktu w klauzuli IN. Wydajność zmniejszy się exponetially z wieloma identyfikatorami produktów (na przykład podczas strony koszyka, z większą ilością produktów w koszyku).

Dzięki.

questionAnswers(1)

yourAnswerToTheQuestion