[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Фильтр по параметрам
OleKh
Таблица 1 Параметры params

products_id | id_parametr | id_value
1 1 2
1 2 3
2 1 1


Таблица 2 Товары products

id
1
2 - не должен выбираться, а фактически выбирается


Фильтр по параметрам формирует запрос такого вида (пример)
SELECT * 
FROM products as p
LEFT JOIN params as pm ON p.id = pm.products_id
WHERE p.id IN
(
SELECT products_id FROM params WHERE id_parametr = 1 and id_value IN (1,2)
)

отбирает норм, но для 1 параметра.
Если 2 параметра
SELECT products_id FROM params WHERE (id_parametr = 1 and id_value IN (1,2, 3, 4)) 
OR  (id_parametr = 2 and id_value IN (3,4))

выборка не соответствует запросу, т.к. выбираются все товары по параметрам 1 и 2, а должны товары по параметрам 1 и 2, но только если товары есть и в 1 и 2 параметре.

У меня получилось реализовать через выборку в цикле, поочередно исключая несоответствующие через array_intersect(), только для 3-х параметров, т.к. больше не требуется.

Вопрос: как реализовать красиво, чтобы одним запросом выбрать?
Guest
Что то не понятно. Более концептуально задачу если можно smile.gif
Если правильно понял, возможно применить EXISTS?
Guest
SELECT products_id FROM params WHERE (id_parametr = 1 and id_value IN (1,2,3,4)) 
OR (id_parametr = 2 and id_value IN (5,6,7,8)) AND products_id IS NOT NULL


Нет?
OleKh
Отредактировал первое сообщение, товар id 2 не имеет параметра 2, а только 1 поэтому исключается. Фактически - выбирается.
Guest
SELECT DISTINCT products_id FROM params WHERE id_parametr = 1 and id_parametr = 2 
OleKh
не получается т.к. должна быть такая конструкция и если OR на AND заменить тоже неправильно
(id_parametr = 1 and id_value IN (1,2,3,4))
Guest
SELECT DISTINCT products_id FROM params WHERE (id_parametr = 1 and id_value IN (1,2,3,4)) 
AND (id_parametr = 2 and id_value IN (5,6,7,8))
OleKh
тоже так проверял, запрос вообще не выдавал результата - 0 строк
Guest
SELECT products_id FROM params WHERE id_parametr IN (1, 2) AND id_value IN (1,2,3,4,5,6,7,8)



dr.nomore
Цитата (OleKh @ 14.11.2013 - 00:06)
выборка не соответствует запросу, т.к. выбираются все товары по параметрам 1 и 2, а должны товары по параметрам 1 и 2, но только если товары есть и в 1 и 2 параметре.

Чудесное тз.

Для начала вопрос: зачем LEFT JOIN?
dr.nomore
Короче я ничего так и не понял, вероятно по тупости своей. Но возникло подозрение что сделано все в корне через ж.

Чтобы соединить таблицы и сохранить left join надо воткнуть условия прямо в выражение соединения

SELECT * 
FROM products p
LEFT JOIN params pm ON p.product.id = pm.products_id AND pm.id_parametr = 1 AND pm.id_value IN (1,2)


Не, все равно ничерта не понял...

Опишите задачу как есть, без легенды.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.