Dans ce cas, je pense que quelque chose comme ceci pourrait fournir la recherche manuelle :
-- [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
Et en le modifiant/simplifiant pour obtenir uniquement les noms d’utilisateur, cela fournirait une liste que vous pourriez copier-coller dans la boîte “Ajouter des utilisateurs” sur la page du ou des groupes si vous exportiez les résultats en csv (et l’ouvriez dans un programme comme notepad, par exemple) :
-- [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
C’est aussi possible.
Vous auriez besoin d’un badge (et d’une requête de badge) pour chaque groupe, et d’une automatisation associée utilisant le script “User Group Membership through Badge”. Vous pourriez également automatiser les badges plutôt que de les attribuer manuellement en activant les Badges Déclenchés Personnalisés (Enable Badge SQL et Creating triggered custom badge queries)
Il y a beaucoup d’éléments en jeu, donc vous voudrez peut-être rester simple à ce stade.