Сводка голосований по темам, включая теги

Мне бы очень хотелось получить запрос Data Explorer для всех тем в категории с количеством голосов по каждой. Я новичок в SQL-запросах и не смог найти ничего существующего, что было бы достаточно близко к тому, что мне нужно, чтобы немного доработать.

В идеале результат должен выглядеть так:

тема голоса ответы теги закрыта
пример темы 1 85 62 web, ios, android FALSE
пример темы 2 79 45 web TRUE

Может ли кто-нибудь помочь мне с этим? Извините, если это не то место. Это показалось мне ближайшей существующей темой.

Здравствуйте и добро пожаловать, @CarrieSeltzer :slight_smile:

Подойдёт ли вам что-то вроде этого?

-- [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

Да, спасибо! Это отлично! Мне нужно лишь одно небольшое изменение — как сделать так, чтобы в экспорте CSV отображалось название темы (а не только её идентификатор)?

Я думаю, что добавление t.title в SELECT должно включить это:

-- [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

Также есть возможность включить в экспорт рабочую ссылку на тему, если вам это интересно, например, используя:

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

Мне немного неловко спрашивать, но я честно не могу понять, куда именно нужно добавить эту часть в коде выше. Куда она должна встать?

Ничего страшного. :slight_smile: Это нужно добавить вот сюда: (просто замените 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