Выборка (фильтр)

filipchuk

Новичок
Выборка (фильтр)

Делаю поиск по таблице свойтв
Структура таблицы: objectId, propertyId, value
Допустим, ввели данные для поиска, при котором нужно получить обьекты, у которых свойство с номером 2 равно 7 и свойство с номером 3 равно 40

делаю запрос
select objectId from estate_object_property where (propertyId = 2 and value = 7) AND (propertyId = 3 and value= 40)

В таблице есть записи для обьекта с id=1
1;2;7
1;3;40

Но возвращаеться 0 найденых обьектов
Знаю, что запрос неверный, но ничего в голову не лезет
В каком направлении думать, подскажите
 

filipchuk

Новичок
да, действительно, с OR все работает, но в базе есть также обьект с id=2, у него тоже свойство 3 = 40, а свойство 2 != 7, поэтому он не должен попадать в выборку, а с OR он попадает
 

berkut

Новичок
Код:
select t1.objectId 
from estate_object_property t1
  INNER JOIN estate_object_property t2 ON t1.objectId = t2.objectId 
where (t1.propertyId = 2 and t1.value = 7) AND (t2.propertyId = 3 and t2.value= 40)
как-то так можно сделать.

предыдущий пост - я невнимательно задачу прочёл
 

filipchuk

Новичок
спасибо за помощь, так работает
но свойств для фильтра может быть больше 2, тогда надо использовать N раз INNER JOIN?
 

berkut

Новичок
с таким вариантом да. но может есть ещё какое решение.
 

filipchuk

Новичок
ясно, может ктото подскажет еще какое-нибудь возможне решение, если нет - буду испольвать ваше.
спасибо еще раз!
 

Mols

Новичок
Выбирайте по условию OR потом сгруппировать по id и получить count(id) - ели этот count(id) совпадёт с числом перечисленных в OR условий - значит этот ID вам подходит. Это как вариант....
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
filipchuk

1. CONCAT
2. IN
3. 1-но условие.
 

filipchuk

Новичок
2 Mols: тоже вариант, я про него думал, но все таки остановился на варианте, предложеном berkut (запрос строиться в цикле, так что не проблема построить для N параметров)

2 Mr_Max: не уловил хода вашей мысли, к сожалению, может дадите более наталкивающий совет :) ?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
SELECT `fields`
FROM `table`
WHERE CONCAT( field1, '_', field2 )
IN ('val1_val2', ....., 'val1N_val2N')
 

berkut

Новичок
Mr_Max а чем это отличается от запроса
Код:
SELECT `fields`
FROM `table` 
WHERE  (field1=val1 AND field2=val2) OR (field1=val1N AND field2=val2N)
, помимо того, что сделано через зад?
 

berkut

Новичок
тем, что оно работает;) а Ваш вариант нет.
к тому-же, на посталенный вопрос так и не ответили
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
berkut
Запрос рабочий.
PHP:
mysql> SELECT * FROM `a`;
+---+---+
| a | b |
+---+---+
| 1 | 2 |
| 3 | 4 |
| 5 | 6 |
| 7 | 8 |
+---+---+
4 rows in set (0.00 sec)

mysql> SELECT *
    -> FROM `a`
    -> WHERE CONCAT( a, '_', b )
    -> IN (
    -> '1_2', '7_8'
    -> );
+---+---+
| a | b |
+---+---+
| 1 | 2 |
| 7 | 8 |
+---+---+
2 rows in set (0.00 sec)
Человек спросил есть ли ещё варианты, я ответил. :)

-~{}~ 28.10.07 15:58:

сделано через зад
Вполне нормальное решение.
я считаю его короче чем
(field1=val1 AND field2=val2) OR (field1=val1N AND field2=val2N)
Особенно если пар значений будет много.
 

berkut

Новичок
Mr_Max
а прочитать пост топик стартера?????
таблица:
id;param;value
1;2;7
1;3;40

а теперь, с помощью конката, сделай то, что нужно топикстартеру - выбери id у которого параметр 2 равен 7 _И_ параметр 3 равен 40

>>Вполне нормальное решение.
>>я считаю его короче чем
а скорость выполнения такого запроса не колышит?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
berkut

а теперь, с помощью конката, сделай то, что нужно топикстартеру - выбери id у которого параметр 2 равен 7 _И_ параметр 3 равен 40
и что из этого?
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Блин. Дошло.

Извиняюсь за свою невнимательность
а свойство 2 != 7
Это уже [офтоп]
скорость выполнения
Скорость выполенния "ошибочного" запроса по конкату меньше, чем по условиям. Но это уже не в теме.
 
Сверху