Задавайте вопросы, мы ответим
Вы не зашли.
У меня есть таблица post_parametrs сделанная по типу «многое ко многим»
id (уникальное, auto_increment)
parametr (id параметра, есть отдельная таблица с ними)
value (id значения - есть таблица значений и соответствий параметру)
id_post (id сообщения, которму принадлежат эти параметры)
Каждому сообщению может принадлежать несколько параметров и соответственно их значений
Например таблица вот такая
id | parameter | value | id_post
1 | 1 | 10 | 100
2 | 2 | 20 | 100
3 | 1 | 12 | 200
4 | 2 | 20 | 200
Теперь мне надо выбрать только те id_post, которые пары которых выбрал пользователь…
Например «Параметр 1» = 10 или 12 и «Параметр 2» = 20.
По сути под этот запрос попадает только id_post = 100
Если я делаю запрос
select * from post_parametrs where
( parametr = 1 AND (value = 10 OR value = 12) )
AND
( parametr = 2 AND value = 20 )
То таких записей нет, а если
select * from post_parametrs where
( parametr = 1 AND (value = 10 OR value = 12) )
OR
( parametr = 2 AND value = 20 )
То выдаст 1, 3 и 4 запись.
Что тоже не правильно :(
Что делать - не знаю :(
Как мне получить правильную выборку?
Неактивен
Я понимаю что можно сделать выборку по первому параметру, а потом в том что получится - выбрать по второму параметру. Но это хорошо если параметра всего 2, а если параметров будет больше?
Неактивен
Пробовал применить вот такое решение:
SELECT * FROM post_parametrs as res_p JOIN post_parametrs as pp ON res_p.id_post = pp.id_post
WHERE res_p.parametr IN (15, 18)
AND (
(pp.parametr = 1 AND pp.value=10) OR (pp.parametr = 1 AND pp.value=12) OR (pp.parametr = 2 AND pp.value=20)
)
Но тоже не помогает
Вроде как выдает результат, но стоит изменить какой-то фильтр и уже неправильная выборка... кажись я запутался в AND/OR
Отредактированно DimasCooleR (26.01.2015 08:27:23)
Неактивен
Структура мне очень не нравится, она плохо масштабируется
Тем не менее, для нее есть «хак»: Вы хотите выбрать те строки основной таблицы,
для которых есть две строки из вот этой объединяющей. Так и ищите: Вам нужна
группировка с количеством. Т.е. в Вашем случае — используем что-то типа
Неактивен
paulus написал:
Структура мне очень не нравится, она плохо масштабируется :(
Но вообще — подумайте о том, чтобы разные данные хранить в разных столбцах,
таблицы, которые хранят всё во всём, как правило, являются источником больших
проблем с дальнейшей эксплуатацией :(
Масштабирование для меня является важным параметром, поэтому я готов сейчас переделать всю таблицу.
Честно говоря я выбрал структуру "многое ко многим" из-за того что не будет пустых ячеек.
У меня есть около 30-40 параметров-фильтров. И делать таблицу в которой каждый столбец будет соответствовать одному параметру - это получится таблица в окторой 80-90% будет ячеек NULL. На сколько я понимаю с точки зрения "нормализации" баз данных это не совсем верно. С другой стороны количество параметров не динамично, т.е. если добавление и будет, то разово. И можно добавить при необходимости столбец. Думал я также и о том, чтобы для каждого параметра сделать свою таблицу - но мне кажется это еще более сложная структура будет для выборки. Подскажите, в каком направлении двигаться, какую структуру выбрать?
paulus написал:
Тем не менее, для нее есть «хак»: Вы хотите выбрать те строки основной таблицы,
для которых есть две строки из вот этой объединяющей. Так и ищите: Вам нужна
группировка с количеством. Т.е. в Вашем случае — используем что-то типа
...skip...
В случае большего количества параметров — добавляем еще один OR и увеличиваем
счетчик.
Спасибо!
Неактивен