#mysql #sql #database
#mysql #sql #База данных
Вопрос:
Я работаю над личным проектом и хочу собрать все сообщения с форума, которые содержат комментарии от обоих пользователей в паре (в данном случае с идентификаторами 7816 и 7424). Я выполнил это с помощью приведенного ниже запроса, но он затруднен, и я убежден, что должен быть лучший способ.
На простом английском языке идея состоит в том, чтобы собрать все уникальные topic_id, которые содержат сообщения по 7816, затем собрать все уникальные topic_id, которые содержат сообщения по 7424, ГДЕ topic_id находится где-то в наборе, сгенерированном для 7816, затем выберите * на этом.
SELECT * FROM forums_posts WHERE topic_id IN (
SELECT distinct topic_id
FROM forums_posts WHERE topic_id IN (
SELECT DISTINCT topic_id
FROM forums_posts
GROUP BY topic_id, author_id
HAVING author_id = 7816
)
GROUP BY topic_id, author_id
HAVING author_id = 7424
) ORDER BY topic_id, post_date;
Я уверен, что мог бы значительно снизить сложность с помощью некоторых трюков, которым я еще не научился. Существует ли общепринятый способ выполнения подобных операций?
Спасибо!
Ответ №1:
Одним из методов является использование агрегации:
select fp.topic_id
from forum_posts fp
where fp.author_id in (7816, 7424)
group by fp.topic_id
having count(distinct fp.author_id) = 2;
Если вам нужны дополнительные сведения, используйте это как подзапрос и объедините таблицы с нужной дополнительной информацией.
Ответ №2:
Вы можете использовать аналитическую функцию count
следующим образом:
Select * from
(select fp.*,
Count(distinct fp.author_id) over (partition by fp.topic_id) as cnt
from forum_posts fp
where fp.author_id in (7816, 7424) )
Where cnt = 2
Order by topic_id, author_id;