Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
saszay Member Откуда: Тольятти Сообщений: 458 |
Добрый день! Можно запросом решить проблему поиска нужных товаров по критериям? Типа как это работает в Яндекс Маркете, MVideo и т.п. интернет магазинах. Т.е. клиент выбирает n параметров товара и получает список, удовлетворяющий всем его выборам. |
17 июн 14, 17:50 [16177702] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4807 |
Запросом решить можно. Но слишком абстрактно поставлена задача. Напиши структуру хранения, какие там параметры. |
||
17 июн 14, 17:52 [16177716] Ответить | Цитировать Сообщить модератору |
saszay Member Откуда: Тольятти Сообщений: 458 |
Есть таблица с описанием товаров: ID товара ID свойства Value varchar(100) - значение свойства И есть таблица с выбором клиента: ID свойства value значение свойства Нужно выбрать все товары из первой таблицы, которые удовлетворяют всем свойствам из второй таблицы... |
17 июн 14, 18:04 [16177779] Ответить | Цитировать Сообщить модератору |
_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] Ответить | Цитировать Сообщить модератору |
Добрый Э - Эх
Guest |
_human, как минимум не учитывается одновременное удовлетворения всем критериям поиска. а автор четко заявил в требованиях:
|
||
18 июн 14, 12:51 [16181545] Ответить | Цитировать Сообщить модератору |
Дедушка Member Откуда: Город трёх революций Сообщений: 5114 |
saszay, не изобретайте велосипед то что вы хотите называется фасетным поиском используйте существующие движки (Sphinx, ElasticSearch ...) |
18 июн 14, 12:59 [16181611] Ответить | Цитировать Сообщить модератору |
_human Member Откуда: Сообщений: 566 |
Добрый Э - Эх, да, это выберет товары с любыми совпавшими свойствами. Выдать ТС-у напильник. |
18 июн 14, 13:02 [16181635] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
А это не реляционное деление часом? Задачка-то элементарная |
18 июн 14, 13:45 [16182050] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
saszay Member Откуда: Тольятти Сообщений: 458 |
Не работает :( |
||
24 июн 14, 15:26 [16212220] Ответить | Цитировать Сообщить модератору |
saszay Member Откуда: Тольятти Сообщений: 458 |
Не работает :( |
||
24 июн 14, 15:26 [16212224] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
ну варианта 3 1. Клеите динамический скл 2. Where +параметр IS NULL or параметр = поле 3. передаете список,массив,таблицу в процедуру и джойнитесь с ней по таблице товаров и парметров |
||
24 июн 14, 15:29 [16212262] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
Maxx, еще вариант 4. Соберать полностью селект на клиенте и передавать его на исполнение 5. Соберать часть where + пункт 1 |
24 июн 14, 15:35 [16212310] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
|
||||
24 июн 14, 15:43 [16212355] Ответить | Цитировать Сообщить модератору |
saszay Member Откуда: Тольятти Сообщений: 458 |
iap, Выводит товар, если хотя бы один из критериев совпал. |
24 июн 14, 15:51 [16212420] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
Это если перевести запрос на русский. Не то, что Вы хотели? А может быть, Вы выполните условия форума и предоставите команду CREATE TABLE и INSERT тестовых данных? |
||
24 июн 14, 15:57 [16212462] Ответить | Цитировать Сообщить модератору |
Shakill Member Откуда: мск Сообщений: 1882 |
|
||||
24 июн 14, 16:00 [16212484] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
saszay, а где вариант заполенния таблицы Tovars_Prop ? Откуда известно что у вас там то ? |
25 июн 14, 09:32 [16214986] Ответить | Цитировать Сообщить модератору |
saszay Member Откуда: Тольятти Сообщений: 458 |
Maxx,
|
||||||||||||||||||||||||||||||||
25 июн 14, 09:35 [16215008] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
saszay Member Откуда: Тольятти Сообщений: 458 |
Maxx, А это зачем ;with товар (IDT,ID,[value]) as ( ... У меня таблица |
25 июн 14, 09:47 [16215058] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
saszay, а ето называеться cte чтоб не сочинять вашу таблицу,в общем и целом в даном случае никакого значения не имеет по факту вообще. |
25 июн 14, 09:51 [16215078] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |