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

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

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

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

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

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

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

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

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

И подзапросы вы имеете в виду вложенные запросы?
...
Рейтинг: 0 / 0
Запрос нескольких значений многое ко многим
    #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
Запрос нескольких значений многое ко многим
    #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
Запрос нескольких значений многое ко многим
    #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
Запрос нескольких значений многое ко многим
    #39069758
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ursido,

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

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

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

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

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


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