Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос нескольких значений многое ко многим / 11 сообщений из 11, страница 1 из 1
05.10.2015, 22:45
    #39068858
Closius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос нескольких значений многое ко многим
Добрый день.

Помогите плиз новичку..

Есть табица User у нее есть поле inter, которое сязано отношением многое ко многим с таблицей Interest

Есть список интересов: 1,7,3

1) как сделать запрос на возвращение всех юзеров у которых обязательно есть inter=1,7,3 ?

2) как сделать запрос всех юзеров у которых есть хотя бы одно значение из листа?

С уважением, Антон.
...
Рейтинг: 0 / 0
05.10.2015, 23:17
    #39068871
p2.
p2.
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос нескольких значений многое ко многим
ClosiusЕсть табица User у нее есть поле inter, которое сязано отношением многое ко многим с таблицей Interestddl
...
Рейтинг: 0 / 0
06.10.2015, 08:35
    #39068973
Щукина Анна
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос нескольких значений многое ко многим
Closius,

Задача реляционного деления. На SQL традиционно решается через [NOT]EXISTS-подзапросы или через группировку с постфильтрацией (GROUP BY + HAVING)
...
Рейтинг: 0 / 0
06.10.2015, 11:31
    #39069151
Closius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос нескольких значений многое ко многим
Щукина Анна,

А можете дать ссылку где про это почитать или пример запроса?
...
Рейтинг: 0 / 0
06.10.2015, 11:31
    #39069152
Closius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос нескольких значений многое ко многим
Щукина Анна,

И подзапросы вы имеете в виду вложенные запросы?
...
Рейтинг: 0 / 0
06.10.2015, 16:00
    #39069563
Closius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос нескольких значений многое ко многим
Closius,

Все оказалось довольно просто (user_inter - промежуточная таблица для many_to_many):

SELECT DISTINCT user_id FROM user_inter WHERE inter_id = ANY(array[1,7,3]);

Но это работает для случае 2. А вот для случая 1 наверно только вложенные запросы.. Типа в первом выбираем всех у кого есть 1, во втором всех у кого есть 7 и в третьем у кого есть 3. Каждый запрос фильтрует предыдущий.
...
Рейтинг: 0 / 0
06.10.2015, 16:24
    #39069598
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос нескольких значений многое ко многим
ClosiusClosius,
<> А вот для случая 1 наверно только вложенные запросы.. Типа в первом выбираем всех у кого есть 1, во втором всех у кого есть 7 и в третьем у кого есть 3. Каждый запрос фильтрует предыдущий.it depends.

в некоторых случаях можно таки через aggregate и having. вернее -- можно всегда, но при некоторой плотности интересов и их многообразии оно даже и проще.

универсально (не по скорости)
~
Код: sql
1.
2.
 ....
HAVING array_agg( inter_id ) @> array_param


или

Код: sql
1.
2.
 ....
HAVING COUNT (CASE WHERM  inter_id = ANY( array_param) THEN 1 END) = array_length( array_param,1) 




в случае, если интересов много и они редки -- дешевле через набор EXISTS-ов. хотя и генерировать скл придётся всякий раз. Или хранимочкой с циклом и статикой. (в т.ч. и WITH RECURSIVE по unnest(array_param), думается, можно нарисовать)


ещё можно вместо реляционных интересов хранить их в array -- поле. И таки да -- индексировать.
...
Рейтинг: 0 / 0
06.10.2015, 17:23
    #39069677
ursido
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос нескольких значений многое ко многим
Closius,

Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT 
  user_id,
  COUNT(inter_id) 
FROM user_inter 
WHERE inter_id = ANY(array[1,7,3])
GROUP BY user_id
HAVING COUNT(inter_id) = 3
...
Рейтинг: 0 / 0
06.10.2015, 18:19
    #39069758
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос нескольких значений многое ко многим
ursido,

count(DISTINCT inter_id) = 3
...
Рейтинг: 0 / 0
06.10.2015, 18:25
    #39069763
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос нескольких значений многое ко многим
vyegorovursido,

count(DISTINCT inter_id) = 3 в таблице связей обычно пк по паре id.
т.ч. "скрипач не нужен"

Или, если связь -- отдельная осмысленная сущность со своими отдельными от id связуемых заморочками -- хотя бы unique.
...
Рейтинг: 0 / 0
06.10.2015, 19:07
    #39069806
Closius
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запрос нескольких значений многое ко многим
Спасибо за ответы! Думаю стоит попробовать разные варианты )

qwwqещё можно вместо реляционных интересов хранить их в array -- поле. И таки да -- индексировать.

И как целостность поддерживать? Тригерами? Не этот вариант мне не нравится.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос нескольких значений многое ко многим / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]