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

Откуда: Тольятти
Сообщений: 458
Добрый день!
Можно запросом решить проблему поиска нужных товаров по критериям? Типа как это работает в Яндекс Маркете, MVideo и т.п. интернет магазинах.

Т.е. клиент выбирает n параметров товара и получает список, удовлетворяющий всем его выборам.
17 июн 14, 17:50    [16177702]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4807
saszay
Добрый день!
Можно запросом решить проблему поиска нужных товаров по критериям? Типа как это работает в Яндекс Маркете, MVideo и т.п. интернет магазинах.

Т.е. клиент выбирает n параметров товара и получает список, удовлетворяющий всем его выборам.


Запросом решить можно. Но слишком абстрактно поставлена задача. Напиши структуру хранения, какие там параметры.
17 июн 14, 17:52    [16177716]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 458
Есть таблица с описанием товаров:

ID товара
ID свойства
Value varchar(100) - значение свойства


И есть таблица с выбором клиента:

ID свойства
value значение свойства

Нужно выбрать все товары из первой таблицы, которые удовлетворяют всем свойствам из второй таблицы...
17 июн 14, 18:04    [16177779]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
_human
Member

Откуда:
Сообщений: 566
saszay,
select t1.[ID товара]
from [таблица с описанием товаров] t1
where exists (
select 1 
from [таблица с выбором клиента] t2
where t1.[ID свойства] = t2.[ID свойства] 
  /*and t1.[Value] = t2.[Value] */
)
18 июн 14, 12:47    [16181523]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
Добрый Э - Эх
Guest
_human,

как минимум не учитывается одновременное удовлетворения всем критериям поиска. а автор четко заявил в требованиях:
saszay
Нужно выбрать все товары из первой таблицы, которые удовлетворяют всем свойствам из второй таблицы...
18 июн 14, 12:51    [16181545]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5114
saszay,

не изобретайте велосипед
то что вы хотите называется фасетным поиском
используйте существующие движки (Sphinx, ElasticSearch ...)
18 июн 14, 12:59    [16181611]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
_human
Member

Откуда:
Сообщений: 566
Добрый Э - Эх,

да, это выберет товары с любыми совпавшими свойствами.
Выдать ТС-у напильник.
18 июн 14, 13:02    [16181635]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
А это не реляционное деление часом?
Задачка-то элементарная
18 июн 14, 13:45    [16182050]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
SELECT CT.*
FROM (SELECT DISTINCT ТоварID FROM Товар) CT
WHERE NOT EXISTS
(
 SELECT *
 FROM Свойство C
 LEFT JOIN Товар T ON T.ТоварID=CT.ТоварID AND C.СвойствоID=T.СвойствоID
 WHERE T.ТоварID IS NULL
);
или так?
SELECT CT.*
FROM (SELECT DISTINCT ТоварID FROM Товар) CT
WHERE NOT EXISTS
(
 SELECT *
 FROM Свойство C
 WHERE NOT EXISTS
 (
  SELECT *
  FROM Товар T
  WHERE T.ТоварID=CT.ТоварID AND T.СвойствоID=C.СвойствоID
  )
);
Не проверял!
18 июн 14, 14:03    [16182222]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
Shakill
Member

Откуда: мск
Сообщений: 1882
SELECT t.*
FROM Товар AS t
WHERE NOT EXISTS
(
 SELECT s.СвойствоID, s.Value FROM Свойство AS s
 EXCEPT
 SELECT t0.СвойствоID, t0.Value FROM Товар AS t0 WHERE t0.ТоварID = t.ТоварID
);
18 июн 14, 14:14    [16182312]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 458
iap
SELECT CT.*
FROM (SELECT DISTINCT ТоварID FROM Товар) CT
WHERE NOT EXISTS
(
 SELECT *
 FROM Свойство C
 LEFT JOIN Товар T ON T.ТоварID=CT.ТоварID AND C.СвойствоID=T.СвойствоID
 WHERE T.ТоварID IS NULL
);
или так?
SELECT CT.*
FROM (SELECT DISTINCT ТоварID FROM Товар) CT
WHERE NOT EXISTS
(
 SELECT *
 FROM Свойство C
 WHERE NOT EXISTS
 (
  SELECT *
  FROM Товар T
  WHERE T.ТоварID=CT.ТоварID AND T.СвойствоID=C.СвойствоID
  )
);
Не проверял!

Не работает :(
24 июн 14, 15:26    [16212220]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 458
Shakill
SELECT t.*
FROM Товар AS t
WHERE NOT EXISTS
(
 SELECT s.СвойствоID, s.Value FROM Свойство AS s
 EXCEPT
 SELECT t0.СвойствоID, t0.Value FROM Товар AS t0 WHERE t0.ТоварID = t.ТоварID
);


Не работает :(
24 июн 14, 15:26    [16212224]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
saszay
Т.е. клиент выбирает n параметров товара и получает список, удовлетворяющий всем его выборам.

ну варианта 3
1. Клеите динамический скл
2. Where +параметр IS NULL or параметр = поле
3. передаете список,массив,таблицу в процедуру и джойнитесь с ней по таблице товаров и парметров
24 июн 14, 15:29    [16212262]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Maxx,

еще вариант
4. Соберать полностью селект на клиенте и передавать его на исполнение
5. Соберать часть where + пункт 1
24 июн 14, 15:35    [16212310]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
saszay
iap
SELECT CT.*
FROM (SELECT DISTINCT ТоварID FROM Товар) CT
WHERE NOT EXISTS
(
 SELECT *
 FROM Свойство C
 LEFT JOIN Товар T ON T.ТоварID=CT.ТоварID AND C.СвойствоID=T.СвойствоID
 WHERE T.ТоварID IS NULL
);

или так?
SELECT CT.*
FROM (SELECT DISTINCT ТоварID FROM Товар) CT
WHERE NOT EXISTS
(
 SELECT *
 FROM Свойство C
 WHERE NOT EXISTS
 (
  SELECT *
  FROM Товар T
  WHERE T.ТоварID=CT.ТоварID AND T.СвойствоID=C.СвойствоID
  )
);

Не проверял!

Не работает :(
И это всё, что Вы можете сказать в ответ?!
24 июн 14, 15:43    [16212355]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 458
iap,

Выводит товар, если хотя бы один из критериев совпал.
24 июн 14, 15:51    [16212420]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
iap
Member

Откуда: Москва
Сообщений: 47047
saszay
iap,

Выводит товар, если хотя бы один из критериев совпал.
Выводит товары, для которых не существует такого свойства, которого не существует у этого товара.
Это если перевести запрос на русский.
Не то, что Вы хотели?

А может быть, Вы выполните условия форума и предоставите команду CREATE TABLE и INSERT тестовых данных?
24 июн 14, 15:57    [16212462]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
Shakill
Member

Откуда: мск
Сообщений: 1882
saszay
Shakill
SELECT t.*
FROM Товар AS t
WHERE NOT EXISTS
(
 SELECT s.СвойствоID, s.Value FROM Свойство AS s
 EXCEPT
 SELECT t0.СвойствоID, t0.Value FROM Товар AS t0 WHERE t0.ТоварID = t.ТоварID
);


Не работает :(
вы бы подробнее отвечали, с данными и комментариями как должно быть и почему
24 июн 14, 16:00    [16212484]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
;with товар (IDT,ID,[value]) as  (
  select 1,1,1
  union all
  select 1,2,1
  union all
  select 2,2,1
  union all
  select 3,2,1

), Выбор (ID, [value]) as (
  select 2,1
)

SELECT t.*
FROM Товар AS t
WHERE NOT EXISTS
(


 SELECT t0.ID, t0.Value FROM Товар AS t0 WHERE t0.IDT = t.IDT
  EXCEPT
  SELECT s.ID, s.Value FROM Выбор AS s
)


Немного исправил вариант Shakill
24 июн 14, 16:29    [16212744]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 458
Maxx,

У меня получился запрос:
DECLARE @proTbl  TABLE (proID int primary key, proValue varchar(255))

INSERT INTO @proTbl VALUES (1595, 'матовая')
INSERT INTO @proTbl VALUES (1591, '15+')

SELECT t.*
FROM Tovars_Prop AS t WITH(noLock)
WHERE NOT EXISTS
(
 SELECT t0.proID, t0.toprName FROM Tovars_Prop AS t0 WHERE t0.toUID = t.toUID
 EXCEPT
 SELECT s.proID, s.proValue FROM @proTbl AS s
)


Но он нечего не возвращает ...
25 июн 14, 08:54    [16214847]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
saszay,

а где вариант заполенния таблицы Tovars_Prop ? Откуда известно что у вас там то ?
25 июн 14, 09:32    [16214986]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 458
Maxx,
toUID toprName proID
84053371-A3CA-DE11-B7B7-0019D1397B99 15+ 1591
D27BCD38-3586-DE11-86AF-0020ED78D221 15+ 1591
48AF98D4-BBE0-DE11-A827-0020ED78D221 15+ 1591
D9DBE7FB-7ED0-DF11-B1E7-0020ED78D221 15+ 1591


toUID toprName proID
1C69C41C-2E68-DF11-80C9-0020ED78D221 матовая1595
943B5DF0-CC9E-DF11-828D-0020ED78D221 матовая1595
31183D37-40C2-DE11-907B-0020ED78D221 матовая1595
9B954809-2CCE-DE11-9E87-0020ED78D221 матовая1595
25 июн 14, 09:35    [16215008]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
;with товар (IDT,ID,[value]) as  (
  select 1,1,N'1'
  union all
  select 1,1591, N'15+'
  union all
  select 2,1591, N'15+'
  union all
  select 3,1595, N'матовая'

), Выбор (ID, [value]) as (
  select 1595, N'матовая'
  union all
  select 1591, N'15+'
)

SELECT t.*
FROM Товар AS t
WHERE NOT EXISTS
(


 SELECT t0.ID, t0.Value FROM Товар AS t0 WHERE t0.IDT = t.IDT
  EXCEPT
  SELECT s.ID, s.Value FROM Выбор AS s
)


У меня на вашем наборе - работает,смотрите у вас там в тектовых полях какаето билиберда скорее всего
25 июн 14, 09:41    [16215031]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
saszay
Member

Откуда: Тольятти
Сообщений: 458
Maxx,

А это зачем
;with товар (IDT,ID,[value]) as  ( ...


У меня таблица
25 июн 14, 09:47    [16215058]     Ответить | Цитировать Сообщить модератору
 Re: Как написать запрос поиска товаров по кретериям?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
saszay,

а ето называеться cte чтоб не сочинять вашу таблицу,в общем и целом в даном случае никакого значения не имеет по факту вообще.
25 июн 14, 09:51    [16215078]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить