根据活动创建一些群组的查询

在我的社区中,我需要根据以下条件对人们进行细分:

  • 收到的点赞数(30 - 100 - 200)
  • 阅读的帖子数(1k - 2k - 5k)
  • 过去一年的最低发帖量

我该如何使用数据浏览器来实现这一点?
我想要一个查询,我可以在其中输入这些参数,它会列出人员,以便我可以手动将他们添加到组中。非常简单。
有什么提示吗?我从哪里开始?

2 个赞

我认为类似这样的东西可以做到:

-- [params]
-- int :likes_received
-- int :posts_read

SELECT 
    us.user_id,
    us.likes_received,
    us.posts_read_count
FROM user_stats us
  JOIN users u on u.id = us.user_id
WHERE u.last_posted_at > CURRENT_DATE - INTERVAL '1 YEAR'
  AND us.likes_received >= :likes_received
  AND us.posts_read_count >= :posts_read
ORDER BY 2 DESC, 3 DESC

太棒了!\n\n如何在过去一年中至少找到帖子 10 次?\n不只是你查询中的一次\n\n如何集成此查询? Posts created for period

只是为了确认一下,您是在查找“所有时间”的点赞数和帖子阅读数,还是说这些计数也包括过去一年内的?

这些看起来很像现有的信任等级组(并且这些组的人数是根据类似措施自动确定的)——为什么不直接修改现有的阈值来完成所有工作呢?

/admin/site_settings/category/trust

例如,对于 TL2(成员在 trust_level_2 或您方言中的等效项):

1 个赞

自动化脚本现在将在有人获得徽章时将他们添加到组中。如果可以使用自定义 SQL 来设置徽章,那么就可以实现自动化,但这听起来像是信任级别。

1 个赞

我可以看到定制的优势。例如,只有 TL3 依赖于随时间的最低参与度。因此,类似的东西也可以在参与度下降一年后将人们从每个自定义组中剔除。

它们也不会受限于固定的功能,并且可以利用支持群组的功能或特定的高级类别。

但我不知道这些的具体设置是什么,所以可能可以通过信任级别来实现。

1 个赞

点赞和帖子阅读数均为所有时间(前者是为了关注好的贡献而不仅仅是帖子,后者是为了平衡)。
帖子最少数量仅限于过去一年,这是一个参数,用于了解成员是否仍然活跃。

这可能是一个好方法,但在我的情况下,我应该大力修改 TL1、TL2 和 TL3,并且需要考虑到以下限制。

抱歉,我不太明白,我应该使用徽章吗?
嗯,我该如何修改上面的查询以将其插入到徽章中?

1 个赞

在这种情况下,我认为类似这样的东西可以提供手动查找:

-- [params]
-- int :likes_received
-- int :posts_read


WITH user_activity AS (

    SELECT
        p.user_id,
        COUNT(p.id) as posts_count
    FROM posts p
    LEFT JOIN topics t ON t.id = p.topic_id
    WHERE p.created_at::date >= CURRENT_DATE - INTERVAL '1 YEAR'
        AND t.deleted_at IS NULL
        AND p.deleted_at IS NULL
        AND t.archetype = 'regular'
    GROUP BY 1
)

SELECT
    us.user_id,
    us.likes_received,
    us.posts_read_count,
    ua.posts_count
FROM user_stats us
  JOIN user_activity ua ON UA.user_id = us.user_id
WHERE us.likes_received >= :likes_received
  AND us.posts_read_count >= :posts_read
  AND ua.posts_count >= 10
ORDER BY 2 DESC, 3 DESC, 4 DESC

并且对其进行调整/精简以仅包含用户名,可以生成一个列表,您可以将其复制并粘贴到组页面的“添加用户”框中,如果您将结果导出为 CSV(并在记事本等中打开它):

-- [params]
-- int :likes_received
-- int :posts_read


WITH user_activity AS (

    SELECT
        p.user_id,
        COUNT(p.id) as posts_count
    FROM posts p
    LEFT JOIN topics t ON t.id = p.topic_id
    WHERE p.created_at::date >= CURRENT_DATE - INTERVAL '1 YEAR'
        AND t.deleted_at IS NULL
        AND p.deleted_at IS NULL
        AND t.archetype = 'regular'
    GROUP BY 1
)

SELECT
    u.username
FROM user_stats us
  JOIN user_activity ua ON UA.user_id = us.user_id
  JOIN users u ON u.id = us.user_id
WHERE us.likes_received >= :likes_received
  AND us.posts_read_count >= :posts_read
  AND ua.posts_count >= 10
ORDER BY 1

这也有可能。 :partying_face: 您将需要一个徽章(和一个徽章查询)对应一个组,以及一个伴随的 自动化 使用“通过徽章的用户组会员资格”脚本。您也可以通过启用自定义触发徽章(Enable Badge SQLhttps://meta.discourse.org/t/create-triggered-custom-badge-queries/19336)来自动授予徽章,而不是手动授予。

不过,有很多环节需要注意,所以您可能希望在此阶段保持简单。

2 个赞

太棒了!非常感谢 Jammy

1 个赞

没关系。 :slight_smile: 希望第一个能帮您检查是否得到了预期的结果,第二个应该能让添加它们到一个组更容易。 :+1:

如果有什么需要调整的,请告诉我。 :slight_smile:

我合并并改进了它们(用我蹩脚的 SQL 技能),如果我需要用户名,我只需下载 CSV 文件并复制/粘贴用户名列
我添加了 likes_received_max,这样我就可以分割组,排除上面的组。

例如
first_steps: 5 个赞(<30),阅读了 500 篇文章,去年发布了 >5 篇文章,
beginners: 30 个赞(<100),阅读了 1000 篇文章,去年发布了 >10 篇文章
padawan: 100 个赞,阅读了 2000 篇文章,去年发布了 >10 篇文章
hero: 200 个赞,阅读了 5000 篇文章,去年发布了 >10 篇文章

-- [params]
-- int :likes_received
-- int :posts_read
-- int :likes_received_max
-- int :posts_count


WITH user_activity AS (
    SELECT
        p.user_id,
        COUNT(p.id) as posts_count
    FROM posts p
    LEFT JOIN topics t ON t.id = p.topic_id
    WHERE p.created_at::date >= CURRENT_DATE - INTERVAL '1 YEAR'
        AND t.deleted_at IS NULL
        AND p.deleted_at IS NULL
        AND t.archetype = 'regular'
    GROUP BY 1
)

SELECT
    us.user_id,
    u.username,
    us.likes_received,
    us.posts_read_count,
    ua.posts_count,
    u.title
FROM user_stats us
  JOIN user_activity ua ON UA.user_id = us.user_id
  JOIN users u ON u.id = us.user_id
WHERE us.likes_received >= :likes_received
  AND us.posts_read_count >= :posts_read
  AND ua.posts_count >= :posts_count
  AND us.likes_received < :likes_received_max
ORDER BY 2 ASC, 3 ASC, 4 ASC

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.