Наше сообщество ориентировано на закрепленные и глобально закрепленные темы. К сожалению, на страницах профиля пользователя вообще нет счетчика статистики для этого, и, похоже, закрепление/глобальное закрепление не хранится систематически ни в одной части базы данных.
В связи с этим я ищу способ выдачи значков, например, «Первый закрепленный», «10 закрепленных», «100 закрепленных», а также за глобально закрепленные темы.
Не мог бы кто-нибудь помочь мне с SQL-запросом для значков такого типа?
Моя отправная точка:
SELECT p.user_id, min(p.created_at) granted_at, MIN(p.id) post_id
FROM badge_posts p
JOIN topics t ON t.id = p.topic_id
WHERE t.unpinned IS NOT NULL
GROUP BY p.user_id
HAVING count(*) > 5
Но это выдает ошибку:
ERROR: column t.unpinned does not exist
LINE 6: WHERE t.unpinned IS NOT NULL
Думаю, мне придется использовать поле unpinned, так как, насколько мне известно, нет других данных, которые сохранялись бы для тем, когда-либо бывших закрепленными. Или, возможно, я мог бы использовать здесь post_actions?
Или, может быть, искать первый пост в теме от пользователя-администратора или системного пользователя, содержащий «pinned … ago», чтобы вести подсчет? action_code => pinned.disabled
Обновление: Похоже, это как-то работает…
SELECT t.user_id, current_timestamp granted_at
FROM badge_posts p
INNER JOIN topics t on t.id = p.topic_id
WHERE p.action_code ilike 'pinned.disabled'
GROUP BY t.user_id
HAVING count(*) > 0
Но я не уверен, что это лучший подход, и так как пост может быть закреплен и откреплен несколько раз… неясно, ловит ли этот запрос только ОДИН случай pinned.disabled на topic.id.
Будет очень признателен за помощь от мастера SQL для значков.
Или же стоит рассмотреть возможность систематического хранения данных о закреплениях в базе данных, подобно «лайкам», и отображать их в разделе статистики профиля пользователя со ссылками «ЗАКРЕПЛЕНО». Ведь если тема закреплена, это выражает гораздо большее признание по сравнению с лайками, и это должно учитываться.
