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.