Помогите сделать подбор по фильтрам

12
[Удален]
781

Делаю так:


SELECT product_id
FROM product_attributes pa
WHERE (attribute='size' and value='medium')
OR (attribute='colour' and value='blue')
GROUP BY product_id
HAVING COUNT(DISTINCT CONCAT(attribute,value) ) = 2

Но мне нужно из таблицы выбрать чтобы было не ИЛИ, и И , но почему то если меняешь OR на AND вообще пустой результат.

Задача: в таблице хранятся характеристики товаров, нужно сделать фильтр по ним, чтобы возвращало id продукта где есть совпадения в нескольких полях/

Или помогите запросом.

siv1987
На сайте с 02.04.2009
Offline
427
#1

а что за условие у HAVING?

[Удален]
#2
siv1987:
а что за условие у HAVING?

Не знаю, я не программист, но ф-ционал нужен 1 запрос

И делал примерно так (просто примерно)

SELECT T.*

FROM Товары T

WHERE EXISTS(SELECT * FROM характеристики H WHERE H.Id=T.Id AND H.feature_id='pp' and H.value IN ('8','8.7')) AND

EXISTS(SELECT * FROM характеристики H WHERE H.Id=T.Id AND H.feature_id='pos' and H.value IN ('Android', 'iOS'))

siv1987
На сайте с 02.04.2009
Offline
427
#3
borroza:
Не знаю, я не программист, но ф-ционал нужен 1 запрос

Так а запрос кто писал?

borroza:
И делал примерно так (просто примерно)

Да, это совсем не похоже на первый запрос. Вам бы надо сказать конкретно что хотите выбрать, из каких таблиц и привести их структуру.

IL
На сайте с 20.04.2007
Offline
435
#4
borroza:
выбрать чтобы было не ИЛИ, и И

это как?

borroza:
фильтр по ним, чтобы возвращало id продукта где есть совпадения в нескольких полях

Он так и возвращает.. там где совпадения в двух полях - вернёт.

borroza:
но почему то если меняешь OR на AND вообще пустой результат.
Наверное, потому, что атрибут не может быть одновременно "белый" и "большой" - это 2 разных атрибута.
... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
[Удален]
#5

Только сейчас добрался до рабочего компьютера.

Есть в 2 таблицы:

Таблица где хранятся названии характеристик:


CREATE TABLE IF NOT EXISTS `my_fields` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) DEFAULT NULL,
`catid` INT(11) DEFAULT NULL,
`show` tinyint(1) NOT NULL,
`order` tinyint(11) NOT NULL,
`selection` tinyint(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=102 ;

И где хранятся сами характеристики (по 90 шт на товар)



CREATE TABLE IF NOT EXISTS `my_features` (
`fid` INT(11) DEFAULT NULL,
`feature` VARCHAR(255) DEFAULT NULL,
`pid` INT(11) DEFAULT NULL,
`catid` INT(11) NOT NULL,
KEY `fid` (`fid`),
KEY `fid_2` (`fid`),
KEY `feature` (`feature`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Требуется -фильтр подбора по характеристикам, который бы учитывал 1 и более параметр.

С 1 параметром все просто, но если их много, я не знаю каким запросом это выцепить.

А вышеуказанные запросы дал просто для ознакомления, пробовал так.

Цель получить допустим мобильные телефоны с

(fid=1 && feature='Android') && (fid=2 && feature='2') - т.е ОС - а андроид и процессор 2 ядра. Ну и много их должно быть.

Мне нужно получить id продукта pid

IL
На сайте с 20.04.2007
Offline
435
#6

Если первый запрос правильно ищет по двум параметрам (т.е. когда оба совпадают), то:

borroza:
который бы учитывал 1 и более параметр.
HAVING COUNT(DISTINCT CONCAT(attribute,value) ) >= 1

По поводу оптимальности (concat, COUNT Distinct) - вопрос спорный.

[Удален]
#7

Первый запрос не ищет

Там стоит OR

WHERE (attribute='size' and value='medium')

OR (attribute='colour' and value='blue')

И меняю на AND вообще ничего

IL
На сайте с 20.04.2007
Offline
435
#8
borroza:
И меняю на AND вообще ничего

Зачем делать бездумно?

(attribute='size' and value='medium')
AND (attribute='colour' and value='blue')

Как одновременно может быть attribute='size' и attribute='colour' ?

siv1987
На сайте с 02.04.2009
Offline
427
#9
borroza:

И меняю на AND вообще ничего

Зачем менять на AND? Вам правильно говорят - атрибут не может быть белым и черным одновременно, или черный или белый.

IL
На сайте с 20.04.2007
Offline
435
#10
siv1987:
атрибут не может быть белым и черным одновременно, или черный или белый.

не-не.. не надо путать.. там "белый" и "большой".. но при этом атрибут один. :D

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий