LINUX.ORG.RU

MySQL Запрос ( Фильтр )

 


0

1

Доброго дня всем. Пытаюсь вымучать фильтр по товаром для мини-магазина. Логика следующая - скрипт получает набор условий ( ID харакетристики = значние ), их может быть сколько угодно. Проблема в том, что не могу сделать их последовательное выполнение. Т.к. по прицнипу 1й where отрабатывает, второй должен отрабатывать на резльутатах 1го, и тд. То есть каждый раз «ужесточая» критерии фильтра. Накидал SQLFiddle, буду признателен за помощь. http://sqlfiddle.com/#!2/4d557/2 По нему видно, что мой запрос возвращает 100й товар, у которого хар-ка 8 == 4, хотя в условии задано 8==12



Последнее исправление: Real1tySucks (всего исправлений: 1)

Или попробуй закинуть в монгу и там ищи

Jaberwock ★★★
()

Я не помню приоритетов AND/OR операторов, но вангую, что возвращается запись с value='HTC'. В таких случаях лучше расставлять скобки.

staseg ★★★★★
()
Ответ на: комментарий от Jaberwock

Можно пример? Я не совсем понимаю, что можно джоинить в одной таблице

Real1tySucks
() автор топика
Ответ на: комментарий от staseg

Если расставлять скобки вокруг каждого условия - в других случаях не отрабатывает. Условий же может быть сколько угодно, т.к. характеристики задаются динамически

Real1tySucks
() автор топика
Ответ на: комментарий от staseg

А чтобы не было неоднозначностей с тем, с какой строки идет выборка данных, выбирай уникальный идентификатор, id в твоем случае.

staseg ★★★★★
()

а у Вас ошибочка не закралась?

`characteristic` = '8' AND `value` = '12' AND
`characteristic` = '9' AND `value` = 'Samsung' OR `value` = 'HTC'
не должно быть так ли:
`characteristic` = '8' AND `value` = '12' OR
`characteristic` = '9' AND `value` = 'Samsung' OR `value` = 'HTC'

я намекаю на замену AND на OR перед второй характеристикой

UPD. Вчитался в условия. Пользуйтесь скобками.

`characteristic` = '8' AND `value` = '12' OR
`characteristic` = '9' AND (`value` = 'Samsung' OR `value` = 'HTC')

bvn13 ★★★★★
()
Последнее исправление: bvn13 (всего исправлений: 2)
Ответ на: комментарий от Real1tySucks

Ну так динамически расставь скобки так как тебе нужно. В данном случае они не расставлены так, что возвращается запись с HTC. Я даже проверил.

staseg ★★★★★
()
Ответ на: комментарий от bvn13

В таком случае я получаю сразу 3 продукта. OR мне вряд ли подходит, мне надо что-бы все условия выполнялись для выборки

Real1tySucks
() автор топика
Ответ на: комментарий от Real1tySucks

select p1.product from `products_characteristics` p1 join `products_characteristics` p2 on p1.product=p2.product where p1.characteristic = '8' AND p1.value = '12' AND p2.characteristic` = '9' AND p2.value in ( 'Samsung' ,'HTC') limit 1

Jaberwock ★★★
()
Последнее исправление: Jaberwock (всего исправлений: 1)
Ответ на: комментарий от Jaberwock

Ну и зачем тут нужен join?

select product 
from `products_characteristics` where
(`characteristic` = '8' AND `value` = '12') OR 
(`characteristic` = '9' AND `value` in ( 'Samsung' ,'HTC'))

дает тот же эффект.

hidden_4003
()
Ответ на: комментарий от bvn13

Нужен товар, который подходит условиям characteristic == 8 && value == 12 && characteristic == 9 && value == Samsung||HTC

И таких комбинаций может быть Нное количество, 1+ условий в каждом. Ваше же решение выводит вообще все возможные товары. Вот тут видно, например http://sqlfiddle.com/#!2/4d557/23

Real1tySucks
() автор топика
Ответ на: комментарий от Real1tySucks

да, решение Jaberwock подходит. чем больше условий, тем больше джойнов. на каждую характеристику свой джойн.

bvn13 ★★★★★
()
Ответ на: комментарий от Jaberwock

Ок, тогда последний вопрос - как это должно выглядеть? Пробую так

select p1.product from `products_characteristics` p1 
join `products_characteristics` p2 on p1.product=p2.product where p1.characteristic = '8' AND p1.value = '4' AND p2.characteristic = '9' AND p2.value in ( 'Samsung' ,'HTC')
join `products_characteristics` p3 on p1.product=p3.product WHERE p3.characteristic = '7' and p3.value='12'
мускуль ругается.

Real1tySucks
() автор топика

Закинь в сфинкс и ищи там.

Apple-ch ★★
()
Ответ на: комментарий от Real1tySucks
select p1.product from `products_characteristics` p1 
join `products_characteristics` p2 on p1.product=p2.product 
join `products_characteristics` p3 on p1.product=p3.product
where p1.characteristic = '8' AND p1.value = '4' 
AND p2.characteristic = '9' AND p2.value in ( 'Samsung' ,'HTC')
AND p3.characteristic = '7' and p3.value='12'
Jaberwock ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.