SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 25.01.2015 18:58:24

DimasCooleR
Участник
Откуда: о.Самуи, Таиланд
Зарегистрирован: 25.01.2015
Сообщений: 4

Выборка из таблицы многое ко многим

У меня есть таблица 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 26.01.2015 06:39:02

DimasCooleR
Участник
Откуда: о.Самуи, Таиланд
Зарегистрирован: 25.01.2015
Сообщений: 4

Re: Выборка из таблицы многое ко многим

Я понимаю что можно сделать выборку по первому параметру, а потом в том что получится - выбрать по второму параметру. Но это хорошо если параметра всего 2, а если параметров будет больше?

Неактивен

 

#3 26.01.2015 07:29:21

DimasCooleR
Участник
Откуда: о.Самуи, Таиланд
Зарегистрирован: 25.01.2015
Сообщений: 4

Re: Выборка из таблицы многое ко многим

Пробовал применить вот такое решение:

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)
)

Но тоже не помогает sad
Вроде как выдает результат, но стоит изменить какой-то фильтр и уже неправильная выборка... кажись я запутался в AND/OR

Отредактированно DimasCooleR (26.01.2015 08:27:23)

Неактивен

 

#4 26.01.2015 14:12:45

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Выборка из таблицы многое ко многим

Структура мне очень не нравится, она плохо масштабируется sad

Тем не менее, для нее есть «хак»: Вы хотите выбрать те строки основной таблицы,
для которых есть две строки из вот этой объединяющей. Так и ищите: Вам нужна
группировка с количеством. Т.е. в Вашем случае — используем что-то типа

SELECT ..., COUNT(*) AS cnt FROM post_parametrs WHERE
( parametr = 1 AND (value = 10 OR value = 12) )
OR
( parametr = 2 AND value = 20 )
GROUP BY id_post
HAVING cnt = 2


В случае большего количества параметров — добавляем еще один OR и увеличиваем
счетчик. Но вообще — подумайте о том, чтобы разные данные хранить в разных столбцах,
таблицы, которые хранят всё во всём, как правило, являются источником больших
проблем с дальнейшей эксплуатацией sad

Неактивен

 

#5 26.01.2015 15:13:48

DimasCooleR
Участник
Откуда: о.Самуи, Таиланд
Зарегистрирован: 25.01.2015
Сообщений: 4

Re: Выборка из таблицы многое ко многим

paulus написал:

Структура мне очень не нравится, она плохо масштабируется :(
Но вообще — подумайте о том, чтобы разные данные хранить в разных столбцах,
таблицы, которые хранят всё во всём, как правило, являются источником больших
проблем с дальнейшей эксплуатацией :(

Масштабирование для меня является важным параметром, поэтому я готов сейчас переделать всю таблицу.
Честно говоря я выбрал структуру "многое ко многим" из-за того что не будет пустых ячеек.

У меня есть около 30-40 параметров-фильтров. И делать таблицу в которой каждый столбец будет соответствовать одному параметру - это получится таблица в окторой 80-90% будет ячеек NULL. На сколько я понимаю с точки зрения "нормализации" баз данных это не совсем верно. С другой стороны количество параметров не динамично, т.е. если добавление и будет, то разово. И можно добавить при необходимости столбец. Думал я также и о том, чтобы для каждого параметра сделать свою таблицу - но мне кажется это еще более сложная структура будет для выборки. Подскажите, в каком направлении двигаться, какую структуру выбрать?


paulus написал:

Тем не менее, для нее есть «хак»: Вы хотите выбрать те строки основной таблицы,
для которых есть две строки из вот этой объединяющей. Так и ищите: Вам нужна
группировка с количеством. Т.е. в Вашем случае — используем что-то типа
...skip...
В случае большего количества параметров — добавляем еще один OR и увеличиваем
счетчик.

Спасибо!

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson