SQL Query Optimization Предлагаемые продукты
Сейчас я попытаюсь лучше объяснить, какова цель следующего вопроса и запроса. Предположим, мы говорим о среде электронной коммерции и базе данных. У нас есть, помимо прочего, три таблицы: products, orders и orders_data. Таблица ORDERS будет обрабатывать все размещенные заказы, а дополнительная таблица, которую мы назовем ORDERS_DATA, будет хранить все продукты, записанные в заказе.
После определения таблиц, без этих ненужных полей для моего вопроса:
ORDERS (*id*, date, totale, ...);
ORDERS_DATA (id_order, id_product, ...);
PRODUCTS (id, name, ...);
Первичный ключ вЗАКАЗЫ являетсяЯ быв то время как в ORDERS_DATA ключ(id_order, id_product).
Что я хотел бы сделать с запросом, чтобы получить, учитываяИДАНТИФИКАЦИОННЫЙ НОМЕР ПРОДУКТА (во время серфинга на странице товара или на странице корзины), предлагаемые товары на основе таблицы ORDERS_DATA. Запрос вернет весь id_product, который живет в тех заказах, где хотя бы один из этих продуктов является заданнымИДАНТИФИКАЦИОННЫЙ НОМЕР ПРОДУКТА
Ради простоты приведу пример. Давайте предположим, что у нас есть эти строки в ORDERS_DATA:
R1(1, 1); R2(1, 2); R3(1, 3); R4(2, 2), R5(2, 5); R6(3, 3);
Я хочу предложения для идентификатора продукта = 2. Мой запрос вернет идентификаторы: 1 и 3 (от R1 и R3 - у них одинаковый идентификатор заказа, и у этого заказа есть также продукт 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
Я уже использовал синтаксис INNER JOIN, но ничего не изменилось в производительности. Запрос занимает 0,0022сек с одним идентификатором продукта в разделе IN. Производительность будет снижаться экспоненциально с несколькими идентификаторами товаров (например, на странице корзины, с большим количеством товаров в корзине).
Благодарю.