# 拥有某些其他徽章的徽章

**URL:** <https://meta.discourse.org/t/badge-for-having-certain-other-badges/173436>\
**Category:** Data & reporting\
**Tags:** sql-triggered-badge\
**Created:** [2020年十二月16日 00:07 UTC](https://meta.discourse.org/t/badge-for-having-certain-other-badges/173436 "2020-12-16T00:07:07Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![Qursch](https://avatars.discourse-cdn.com/v4/letter/q/c37758/32.png) [@Qursch](https://meta.discourse.org/u/Qursch)\
**Post date:** [2020年十二月16日 00:07 UTC](https://meta.discourse.org/t/badge-for-having-certain-other-badges/173436/1 "2020-12-16T00:07:07Z")

</div>

我正在编写一个 SQL 徽章查询，用于当用户拥有指定列表中的所有徽章时授予其徽章（例如 ID 为 3、4 和 5 的徽章）。

我知道以下查询适用于单个徽章：

```sql
SELECT user_id, count(id), current_timestamp AS granted_at
FROM user_badges 
WHERE badge_id = 4
GROUP BY user_id 

```

但如何使其适用于多个徽章 ID 呢？添加另一个 `badge_id = X` 条件行不通，因为这只会查找同时拥有这两个徽章的用户（逻辑上需要的是交集）。`INTERSECT` 看起来可行，但不被支持。此查询将每天运行，且不针对任何帖子。  
谢谢！

---

<div class="post-metadata">

**Author:** ![alefattorini](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/alefattorini/32/119928_2.png) [@alefattorini](https://meta.discourse.org/u/alefattorini)\
**Post date:** [2020年十二月17日 10:38 UTC](https://meta.discourse.org/t/badge-for-having-certain-other-badges/173436/2 "2020-12-17T10:38:51Z")

</div>

我使用类似这样的方法来为我的成员创建“替代用户等级”。  
你可以将 `ib.badge_id` 替换为你的成员应获得的徽章 ID。

```sql
SELECT user_id, CURRENT_TIMESTAMP granted_at, NULL post_id
FROM user_badges pb
WHERE badge_id = 1
AND EXISTS (
  SELECT 1 FROM user_badges ib
  WHERE pb.user_id = ib.user_id
  AND ib.badge_id = 11
)
AND EXISTS (
  SELECT 1 FROM user_badges ib
  WHERE pb.user_id = ib.user_id
  AND ib.badge_id = 124
)
AND EXISTS (
  SELECT 1 FROM user_badges ib
  WHERE pb.user_id = ib.user_id
  AND ib.badge_id = 123
)
AND EXISTS (
  SELECT 1 FROM user_badges ib
  WHERE pb.user_id = ib.user_id
  AND ib.badge_id = 127
)
AND EXISTS (
   SELECT 1 FROM user_badges ib
   WHERE pb.user_id = ib.user_id
  AND ib.badge_id = 5
)

```

---

<div class="post-metadata">

**Author:** ![Qursch](https://avatars.discourse-cdn.com/v4/letter/q/c37758/32.png) [@Qursch](https://meta.discourse.org/u/Qursch)\
**Post date:** [2020年十二月17日 12:27 UTC](https://meta.discourse.org/t/badge-for-having-certain-other-badges/173436/3 "2020-12-17T12:27:33Z")

</div>

感谢您的帮助，这完全可行！

---

<div class="post-metadata">

**Author:** ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)\
**Post date:** [2021年一月16日 12:27 UTC](https://meta.discourse.org/t/badge-for-having-certain-other-badges/173436/4 "2021-01-16T12:27:35Z")

</div>

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