需要一些关于 Badge SQL 的帮助

大家好,

我有一些徽章 SQL,它会根据在特定类别中创建的主题数量颁发徽章,该类别还包含主题的第一个帖子中的特定短语(特定 URL)。

它有效,但并非完全如预期:

SELECT badge_posts.user_id, min(badge_posts.created_at) granted_at, MIN(badge_posts.id) AS post_id
FROM badge_posts
JOIN topics ON topics.id = badge_posts.topic_id
WHERE category_id = 17
AND badge_posts.post_number = 1
AND badge_posts.raw LIKE '%dronescene.co.uk%'
GROUP BY badge_posts.user_id
HAVING COUNT(*) > 49
ORDER BY post_id DESC

我有四种可用徽章:铜牌、银牌、金牌和白金牌,我使用类似 HAVING count(*) > 1 来表示铜牌,HAVING count(*) > 10 来表示银牌,依此类推。所有徽章都会自动颁发,没有问题。

我似乎遇到的问题是,所有徽章都是针对该类别中符合我的 WHERE 子句的第一个主题 ID 颁发的,而不是最后一个符合条件的主题 ID。

例如,我有一名会员拥有三个徽章,所有三个徽章都针对他制作的第一个符合我的 WHERE 子句的主题颁发,而不是针对符合我的 WHERE 子句的最新主题 ID。

有人能告诉我我的 ORDER BY 有什么问题吗?:thinking:

1 个赞

我还是个SQL新手,但这是MIN吗?这不会返回第一个而不是最后一个吗?

2 个赞

我的猜测是按主题 SORT DESC(降序排序),然后你可能会得到最后一个。

2 个赞

如果我将 MIN 替换为 MAX,我将获得最新的主题 ID(感谢 @JammyDodger),但现在查看了一些预览更改后,我认为我的逻辑本身就有根本性缺陷 :grimacing:

使用 MAX 会导致此组中的所有其他徽章都因最新的主题 ID 而获得。

这只是反过来的同一个问题。

哎呀 :man_facepalming:

我的逻辑很简单:

问题在于,如果有人在一月份获得铜牌,三月份获得银牌,六月份获得金牌,那么所有这三个徽章都将因一月份的第一个主题 ID 而获得 :thinking:

有人有什么想法吗? :man_shrugging:

2 个赞

认为那是因为您正在针对已经符合所有四个条件的用户运行它。如果它是“全新”引入的,我认为一旦用户达到某个阈值,它就会自动授予最新的主题日期。

对于“遗留”运行,您可能需要添加一个 LIMIT?

**编辑:**一次查询返回每个用户符合条件的前 25 条记录(例如)超出了我目前的技能。 :slightly_smiling_face:

但是,根据有多少用户符合多个徽章的条件,您可以使用数据浏览器查询中的信息手动授予遗留徽章?然后运行上面的自动徽章查询,在授予这些徽章后,应该会为正确的帖子授予正确的徽章。

类似这样:

-- [params]
-- int :user_id = 1
-- int :limit = 50

SELECT bp.user_id, bp.created_at, bp.id as post_id
FROM badge_posts bp
JOIN topics t ON t.id = bp.topic_id
WHERE bp.user_id = :user_id
AND t.category_id = 17
AND bp.post_number = 1
AND bp.raw LIKE '%dronescene.co.uk%'
ORDER BY bp.created_at ASC
LIMIT :limit

抱歉任何拼写错误。 :slightly_smiling_face:

(青铜应该可以使用 MIN 版本完成,白金可以使用 MAX 完成,所以只有 10 和 25 个)

2 个赞