Это хороший пример нескольких особенностей данных Discourse, которые помогут вам получать более точные результаты при построении запросов.
Поскольку большинство постов и тем «мягко удаляются» при их удалении, они по-прежнему остаются в базе данных и могут включаться в отчеты по пользовательской статистике. Поэтому полезно исключать их из любых результатов, которые вы хотите извлечь, например, для статистики пользователей или категорий. Аналогично, вы также можете захотеть исключить из статистики личные сообщения, а также системных пользователей.
Вот несколько советов, как это сделать:
Этот SQL-запрос используется для получения топ-10 пользователей (за исключением системных), сделавших наибольшее количество публичных постов, с исключением любых удалённых постов или постов из удалённых тем.
-- Выбор user_id из таблицы posts и подсчёт количества постов каждого пользователя
SELECT
p.user_id,
COUNT(p.id) AS "Post Count"
FROM posts p
-- Левое соединение с таблицей topics по topic_id
LEFT JOIN topics t ON t.id = p.topic_id
WHERE
-- Исключаем темы личных сообщений
t.archetype <> 'private_message'
-- Исключаем удалённые темы
AND t.deleted_at ISNULL
-- Исключаем удалённые посты
AND p.deleted_at ISNULL
-- Исключаем whispers, посты с малым действием и посты модераторов
AND p.post_type = 1
-- Исключаем посты, сделанные системным пользователем и discobot (user_id 0 и -1)
AND p.user_id > 0
-- Группировка результатов по user_id
GROUP BY 1
-- Сортировка результатов по количеству постов в порядке убывания
ORDER BY 2 DESC
-- Ограничение результатов топ-10 пользователей с наибольшим количеством постов
LIMIT 10
А вот этот же запрос без встроенных комментариев:
SELECT
p.user_id,
COUNT(p.id) AS "Post Count"
FROM posts p
LEFT JOIN topics t ON t.id = p.topic_id
WHERE t.archetype <> 'private_message'
AND t.deleted_at ISNULL
AND p.deleted_at ISNULL
AND p.post_type = 1
AND p.user_id > 0
GROUP BY 1
ORDER BY 2 DESC
LIMIT 10
Это лишь простой запрос для демонстрации примеров, но, надеемся, он поможет вам начать работу с Data Explorer.
Если у вас возникнут вопросы, пожалуйста, задайте их ниже. ![]()