Задать вопрос
@eugene159

Как написать SQL запрос для выборки записей, который учитывает кол-во существующих в таблице записей с таким же ключом?

Есть таблица Товары (столбцы: ключ товара, поля товара (несколько других неважных столбцов)).
Есть таблица Характеристики (столбцы: ключ характеристики, поля характеристики (несколько других неважных столбцов)).
Есть таблица Товар-Характеристика-ЗначениеХарактеристики (столбцы: ключ товара, ключ характеристики, значение характеристики).

Задача - к одному товару подобрать сопутствующие товары. Это такие товары, у которых значения определенных характеристик точно такие же.

Важный момент! В таблице Товар-Характеристика-ЗначениеХарактеристики может быть несколько строк с одинаковыми ключом товара и ключом характеристики. Таким образом в системе сделана возможность указать список значений какой-либо характеристики. То есть допускается, что у какой-либо характеристики может быть несколько значений.

Как мне выбрать записи из таблицы Товар-Характеристика-ЗначениеХарактеристики, чтобы в них значения характеристик было одинаковым. И количество значений - тоже.

Вот пример.
Есть 2 краски.
У первой характеристика Применение имеет значения: для металла, для дерева, для камня.
У второй характеристика Применение имеет значения: для металла, для дерева.
ЭТО НЕ СОПУТСТВУЮЩИЕ ТОВАРЫ, так как у первой применение шире. То есть такие строки надо как-то избегать.

Как мне написать такой запрос?
  • Вопрос задан
  • 237 просмотров
Подписаться 2 Простой 5 комментариев
Пригласить эксперта
Ответы на вопрос 2
В песочнице я создал таблицу Товар-Характеристика-ЗначениеХарактеристики и добавил в нее характеристики 3-х товаров. Товары с id=1 и id=3 являются сопутствующими друг другу.

Поиграться можно тут.
Ответ написан
erge
@erge
Примус починяю
т.к. набор характеристик может быть совершенно разнообразным, а известен нам только товар (его id), то сопоставлять необходимо по набору характеристик и их кол-ву, т.е. объединяем таблицу саму с собой, из первой выбираем наш продукт и по его набору характеристик соединяем со второй, при этом исключаем исходный товар из второй, как-то так:

WITH param AS (
  SELECT 5 AS prod_id -- ИД продукта которому ищем сопутствующие
)
SELECT p2.prod_id
  FROM param, prod_ch_val p1, prod_ch_val p2
  WHERE p1.prod_id = param.prod_id   -- ИД продукта
    AND p1.ch_id=p2.ch_id
    AND p1.val = p2.val
    AND p1.prod_id != p2.prod_id
    AND (SELECT count(1) FROM prod_ch_val t WHERE t.prod_id=p2.prod_id) = (SELECT count(1) FROM prod_ch_val t WHERE t.prod_id=p1.prod_id)
GROUP BY p2.prod_id


пример
идентичные товары:
1 и 3
2 и 5
4 - не идентичен ни с кем.

PS: выражение WITH можно убрать и подставлять ID товара непосредственно в запрос вместо param.prod_id
сделал для удобства
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы