Um resumo de votos por tópico, incluindo tags

Eu adoraria ter uma consulta do Explorador de Dados para todos os tópicos em uma categoria e o número de votos em cada um. Sou novo em consultas SQL e não consegui encontrar nada existente que parecesse próximo o suficiente para eu ajustar.

Idealmente, ficaria assim:

tópico votos respostas tags fechado
tópico de exemplo 1 85 62 web, ios, android FALSO
tópico de exemplo 2 79 45 web VERDADEIRO

Alguém pode me ajudar com isso? Desculpas se este for o lugar errado. Pareceu o tópico existente mais próximo.

1 curtida

Olá e bem-vindo(a) @CarrieSeltzer :slight_smile:

Algo assim funcionaria para você?

-- [params]
-- int :category_id 

WITH tag_names AS (
    SELECT t.id topic_id,
    string_agg(tags.name, ', ' ORDER BY tags.name) AS "tags"
    FROM topics t
    JOIN topic_tags tt ON tt.topic_id = t.id
    JOIN tags ON tags.id = tt.tag_id
    GROUP BY t.id
)

SELECT t.created_at::date,
       dvtvc.topic_id,
       votes_count,
       t.posts_count,
       tn.tags,
       t.closed
FROM discourse_voting_topic_vote_count dvtvc
JOIN topics t ON t.id = dvtvc.topic_id
LEFT JOIN tag_names tn ON dvtvc.topic_id = tn.topic_id
WHERE t.category_id = :category_id
AND votes_count > 0
ORDER BY t.created_at DESC

1 curtida

Sim, obrigado! Isso é ótimo! Só preciso de um pequeno ajuste: como faço para que ele exiba o nome do tópico na exportação CSV (não apenas o ID do tópico)?

1 curtida

Acho que adicionar t.title ao SELECT deve incluir isso:

-- [params]
-- int :category_id 

WITH tag_names AS (
    SELECT t.id topic_id,
    string_agg(tags.name, ', ' ORDER BY tags.name) AS "tags"
    FROM topics t
    JOIN topic_tags tt ON tt.topic_id = t.id
    JOIN tags ON tags.id = tt.tag_id
    GROUP BY t.id
)

SELECT t.created_at::date,
       dvtvc.topic_id,
       t.title,
       votes_count,
       t.posts_count,
       tn.tags,
       t.closed
FROM discourse_voting_topic_vote_count dvtvc
JOIN topics t ON t.id = dvtvc.topic_id
LEFT JOIN tag_names tn ON dvtvc.topic_id = tn.topic_id
WHERE t.category_id = :category_id
AND votes_count > 0
ORDER BY t.created_at DESC

Há também uma opção para incluir um link funcional para o tópico na exportação também, se você quiser, usando por exemplo:

'https://meta.discourse.org/t/' || t.slug || '/' || t.id AS topic_url,
2 curtidas

Sinto-me bobo em perguntar isso, mas honestamente não consigo descobrir onde adicionaria esta parte no código acima. Onde iria?

2 curtidas

Tudo bem. :slight_smile: Isso entraria nesta parte aqui: (apenas mude para o endereço do seu próprio site em vez de Meta)

-- [params]
-- int :category_id 

WITH tag_names AS (
    SELECT t.id topic_id,
    string_agg(tags.name, ', ' ORDER BY tags.name) AS "tags"
    FROM topics t
    JOIN topic_tags tt ON tt.topic_id = t.id
    JOIN tags ON tags.id = tt.tag_id
    GROUP BY t.id
)

SELECT t.created_at::date,
       dvtvc.topic_id,
       t.title,
       'https://meta.discourse.org/t/' || t.slug || '/' || 
       t.id AS topic_url,
       votes_count,
       t.posts_count,
       tn.tags,
       t.closed
FROM discourse_voting_topic_vote_count dvtvc
JOIN topics t ON t.id = dvtvc.topic_id
LEFT JOIN tag_names tn ON dvtvc.topic_id = tn.topic_id
WHERE t.category_id = :category_id
AND votes_count > 0
ORDER BY t.created_at DESC

2 curtidas