Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Найти похожие товары  [new]
Varcom
Member

Откуда:
Сообщений: 310
Есть три таблицы:
- Товары (Products): Id, Name
- Свойства товаров (Properties): Id, Name
- Значения свойств товаров (Values): ProductId, PropertyId, Value
Как найти товары у которых значения всех свойств, кроме одного, одинаковы?
Как вариант задачи: количество свойств у похожих товаров может отличаться на 1-2, но имеющиеся совпадают, кроме одного.
27 янв 12, 14:30    [11983482]     Ответить | Цитировать Сообщить модератору
 Re: Найти похожие товары  [new]
aleks2
Guest
;with
Pairs as(
select P1.ID ID1, P2.ID ID2
FROM Products P1 INNER JOIN Products P2 ON P1.ID<P2.ID
)
select * FROM Pairs P
where
(select COUNT(*) FROM 
  (select * from Values WHERE ProductId=P.ID1) V1 
  full outer join 
  (select * from Values WHERE ProductId=P.ID2) V2
  ON V1.PropertyId=V2.PropertyId AND T1.Value=T2.Value
   WHERE T2.ProductId is null or T1.ProductId is null
)
<2
27 янв 12, 15:35    [11984184]     Ответить | Цитировать Сообщить модератору
 Re: Найти похожие товары  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
SELECT P1.ID, P2.ID
FROM
 [Products] P1 JOIN [Values] V1 ON P1.Id=V1.ProductId
FULL JOIN
 [Products] P2 JOIN [Values] V2 ON P2.Id=V2.ProductId
ON P1.Id<P2.Id AND V1.[PropertyId]=V2.[PropertyId] AND V1.[Value]=V2.[Value]
GROUP BY P1.ID, P2.ID
HAVING 2*COUNT(*)-COUNT(P1.Id)-COUNT(P2.Id)<=2;
?
Не проверял...
27 янв 12, 16:02    [11984410]     Ответить | Цитировать Сообщить модератору
 Re: Найти похожие товары  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Хотя, если на одно свойство могут отличаться, а не на "1-2", то
SELECT P1.ID, P2.ID
FROM
 [Products] P1 JOIN [Values] V1 ON P1.Id=V1.ProductId
FULL JOIN
 [Products] P2 JOIN [Values] V2 ON P2.Id=V2.ProductId
ON P1.Id<P2.Id AND V1.[PropertyId]=V2.[PropertyId] AND V1.[Value]=V2.[Value]
GROUP BY P1.ID, P2.ID
HAVING 2*COUNT(*)-COUNT(P1.Id)-COUNT(P2.Id)<=1;
?
27 янв 12, 16:05    [11984430]     Ответить | Цитировать Сообщить модератору
 Re: Найти похожие товары  [new]
Набор свойств
Guest
Varcom,

у товаров набор свойств одинаков?
27 янв 12, 16:25    [11984633]     Ответить | Цитировать Сообщить модератору
 Re: Найти похожие товары  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Набор свойств
Varcom,

у товаров набор свойств одинаков?
Я думал, если у одного свойство есть, а у другого нет, то это тоже одно отличие...
27 янв 12, 16:30    [11984691]     Ответить | Цитировать Сообщить модератору
 Re: Найти похожие товары  [new]
Набор свойств
Guest
iap
Набор свойств
Varcom,

у товаров набор свойств одинаков?
Я думал, если у одного свойство есть, а у другого нет, то это тоже одно отличие...



вариант:
товар 1
свойства A,B
товар 2
свойства A,B,C


значения свойств A,B совпадают.

Вопрос
Является ли товар 2 "достойным заменителем" товара 1?
27 янв 12, 16:44    [11984843]     Ответить | Цитировать Сообщить модератору
 Re: Найти похожие товары  [new]
Varcom
Member

Откуда:
Сообщений: 310
Набор свойств
у товаров набор свойств одинаков?
Нет. В одной базе товары разных типов. У одних товаров могут быть одни свойства, у других - другие. А еще, для одного типа товаров набор свойств может отличаться, вроде, у одних мобильников есть камера, и соответственно, свойства этой камеры, у других мобильников нет камеры.
27 янв 12, 16:53    [11984961]     Ответить | Цитировать Сообщить модератору
 Re: Найти похожие товары  [new]
Varcom
Member

Откуда:
Сообщений: 310
Набор свойств
iap
пропущено...
Я думал, если у одного свойство есть, а у другого нет, то это тоже одно отличие...



вариант:
товар 1
свойства A,B
товар 2
свойства A,B,C


значения свойств A,B совпадают.

Вопрос
Является ли товар 2 "достойным заменителем" товара 1?

Как правило, свойств более 3. Ориентировочно от 10. Спорные случаи (мало свойств и др) я буду разруливать вручную.
27 янв 12, 16:56    [11985000]     Ответить | Цитировать Сообщить модератору
 Re: Найти похожие товары  [new]
Набор свойств
Guest
Varcom
Набор свойств
у товаров набор свойств одинаков?
Нет. В одной базе товары разных типов. У одних товаров могут быть одни свойства, у других - другие. А еще, для одного типа товаров набор свойств может отличаться, вроде, у одних мобильников есть камера, и соответственно, свойства этой камеры, у других мобильников нет камеры.



товары с разными наборами свойств сравнивать только по пересекающимся свойствам или по всем?

iap
если у одного свойство есть, а у другого нет, то это тоже одно отличие...
?
27 янв 12, 17:00    [11985028]     Ответить | Цитировать Сообщить модератору
 Re: Найти похожие товары  [new]
Varcom
Member

Откуда:
Сообщений: 310
Набор свойств
товары с разными наборами свойств сравнивать только по пересекающимся свойствам или по всем?
Более простой вариант: найти товары, у которых одинаковое количество свойств и все эти свойства, кроме одного (непохожего), совпадают (все записи таблицы Values, выбранные по ProductId=Id1 и ProductId=Id2 совпадают по ProperdyId и по Value).
iap
если у одного свойство есть, а у другого нет, то это тоже одно отличие...
?
Более сложный вариант: найти товары, у которых количество свойств отличается на 1(или 2), а все имеющиеся свойства, за исключением одного (непохожего), совпадают. Т.е. если мы сделаем пересечение свойств двух похожих товаров, то количество элементов пересечения будет содержать на один меньше (непохожий), чем количеств элементов у товара с минимальным количеством свойств.
27 янв 12, 17:46    [11985530]     Ответить | Цитировать Сообщить модератору
 Re: Найти похожие товары  [new]
Varcom
Member

Откуда:
Сообщений: 310
iap
Хотя, если на одно свойство могут отличаться, а не на "1-2", то
SELECT P1.ID, P2.ID
FROM
 [Products] P1 JOIN [Values] V1 ON P1.Id=V1.ProductId
FULL JOIN
 [Products] P2 JOIN [Values] V2 ON P2.Id=V2.ProductId
ON P1.Id<P2.Id AND V1.[PropertyId]=V2.[PropertyId] AND V1.[Value]=V2.[Value]
GROUP BY P1.ID, P2.ID
HAVING 2*COUNT(*)-COUNT(P1.Id)-COUNT(P2.Id)<=1;
?

Не выполняется за обозримое время :(
27 янв 12, 17:50    [11985574]     Ответить | Цитировать Сообщить модератору
 Re: Найти похожие товары  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Varcom
iap
Хотя, если на одно свойство могут отличаться, а не на "1-2", то
SELECT P1.ID, P2.ID
FROM
 [Products] P1 JOIN [Values] V1 ON P1.Id=V1.ProductId
FULL JOIN
 [Products] P2 JOIN [Values] V2 ON P2.Id=V2.ProductId
ON P1.Id<P2.Id AND V1.[PropertyId]=V2.[PropertyId] AND V1.[Value]=V2.[Value]
GROUP BY P1.ID, P2.ID
HAVING 2*COUNT(*)-COUNT(P1.Id)-COUNT(P2.Id)<=1;
?

Не выполняется за обозримое время :(
Что план говорит?
А с aleks2 что?
27 янв 12, 20:02    [11986277]     Ответить | Цитировать Сообщить модератору
 Re: Найти похожие товары  [new]
aleks2
Guest
iap
Varcom
пропущено...

Не выполняется за обозримое время :(
Что план говорит?
А с aleks2 что?


1. Дык, мой вариант нисколько не оптимальней - коррелированный запрос => тоже будет долго.
2. Просто твой не совсем правильный. Я что-то похожее пытался написать - там неразрешимые логические противоречия возникают.
28 янв 12, 05:59    [11988437]     Ответить | Цитировать Сообщить модератору
 Re: Найти похожие товары  [new]
sti
Member

Откуда:
Сообщений: 769
Varcom, а можно узнать, для чего?
Просто у меня в практике всегда задача звучала примерно так: найти товары, совпадающие с заданным, по указанному набору свойств.
28 янв 12, 17:21    [11989248]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить