Выбор сообщений на форуме, в которых есть сообщения от двух конкретных пользователей — есть ли лучший способ?

#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;