各位!我尝试搜索了一下,但什么也没找到。
有没有办法根据用户担任版主的时间长短来授予徽章?
在我们的例子中,有一些版主多年来一直是团队的重要组成部分,我们想给他们一个特殊的徽章。
基本上,查询应该检查以下条件:
用户当前是版主吗?
用户担任版主角色多少天了?
这样我们就可以为活跃了 1 年、3 年、5 年等的版主发放徽章。
各位!我尝试搜索了一下,但什么也没找到。
有没有办法根据用户担任版主的时间长短来授予徽章?
在我们的例子中,有一些版主多年来一直是团队的重要组成部分,我们想给他们一个特殊的徽章。
基本上,查询应该检查以下条件:
用户当前是版主吗?
用户担任版主角色多少天了?
这样我们就可以为活跃了 1 年、3 年、5 年等的版主发放徽章。
尚未尝试将其设置为徽章 SQL,但这是一个用于获取版主作为其角色的天数的数据浏览器查询:
WITH moderator_role_dates AS (
SELECT
gu.user_id,
MIN(gu.created_at) AS role_granted_date
FROM
group_users gu
JOIN groups g ON gu.group_id = g.id
WHERE
g.name = 'moderators'
GROUP BY
gu.user_id
),
current_date_info AS (
SELECT
CURRENT_DATE AS today
)
SELECT
mrd.user_id,
u.username,
mrd.role_granted_date,
cdi.today,
(cdi.today - mrd.role_granted_date) AS days_in_role
FROM
moderator_role_dates mrd
JOIN users u ON mrd.user_id = u.id,
current_date_info cdi
ORDER BY
days_in_role DESC
我刚刚将此标记为 sql-triggered-badge,但我想确认您是在寻找自动徽章还是手动徽章?我假设您可能没有很多版主,并且可以根据数据浏览器查询手动授予此徽章?
我认为上面简化版本可以这样写:
-- [params]
-- int :years
WITH time_in_mod_group AS (
SELECT
user_id,
(CURRENT_DATE - created_at::date) AS days_as_mod
FROM group_users
WHERE group_id = 2 -- 'moderator' group 的 group id
AND user_id > 0 -- 排除系统用户和机器人
)
SELECT
user_id,
days_as_mod
FROM time_in_mod_group
WHERE days_as_mod > (365 * :years)
这可以作为一个数据浏览器查询而不是一组 SQL 徽章来使用,并且可以选出符合条件的用户名列表,以便您手动授予他们徽章。
有一个注意事项是,如果他们中途离开版主组然后重新加入,它将只计算最新的加入时间。我认为可以使用 user_histories 表来解决这个问题,但如果这是一个例外情况,那么手动处理可能更容易。
是的,应该是自动的。基本上,我们只是想为版主设置多个徽章(1年、2年、3年等),根据他们担任版主的时间自动授予他们徽章。
我认为上面的那个可以适应,如果你移除参数并将 WHERE 改为每个不同的天数阈值,例如。
WHERE days_as_mod > 365
(触发器将是 update daily)
谢谢,理论上我们可以做到,但只要我们能以不损害安全性的方式自动完成,我们宁愿选择这种方式。![]()
我非常感谢这段代码,我们将尝试与我们的主机提供商 CommuniteQ 一起实施它,并在此处反馈。