Consejos comunes de datos de Discourse

Este es un buen ejemplo de un par de peculiaridades de los datos de Discourse que pueden ayudarte a obtener resultados más precisos al crear tus consultas.

Como la mayoría de las publicaciones y temas se ‘eliminan de forma lógica’ cuando los eliminas, esto significa que aún aparecerán en la base de datos y pueden incluirse en las estadísticas de informes personalizados, por lo que puede ser útil filtrarlos de cualquier resultado que desees extraer para estadísticas de usuarios o categorías, por ejemplo. De manera similar, también es posible que desees excluir los Mensajes Personales de tus estadísticas, así como los usuarios del sistema.

Aquí tienes un par de consejos sobre cómo filtrarlos:

Esta consulta SQL se utiliza para obtener los 10 usuarios principales (excluyendo a los usuarios del sistema) que han realizado la mayor cantidad de publicaciones públicas, excluyendo cualquier publicación, o publicaciones de temas, que hayan sido eliminadas.

-- Seleccionando user_id de la tabla posts y contando el número de posts que ha hecho cada usuario
SELECT 
    p.user_id,
    COUNT(p.id) AS "Número de Posts"
FROM posts p
  -- Unión izquierda con la tabla topics por topic_id
  LEFT JOIN topics t ON t.id = p.topic_id
WHERE 
  -- Excluir temas de mensajes privados
  t.archetype <> 'private_message'
  -- Excluir temas que han sido eliminados
  AND t.deleted_at ISNULL
  -- Excluir posts que han sido eliminados
  AND p.deleted_at ISNULL
  -- Excluir susurros, posts de acciones pequeñas y posts de moderadores
  AND p.post_type = 1
  -- Excluir posts hechos por el usuario del sistema y discobot (user_id 0 y -1)
  AND p.user_id > 0
-- Agrupar los resultados por user_id 
GROUP BY 1
-- Ordenar los resultados por el recuento de posts en orden descendente 
ORDER BY 2 DESC
-- Limitar los resultados a los 10 usuarios principales con más posts
LIMIT 10

Y aquí está sin los comentarios en línea:

SELECT 
    p.user_id,
    COUNT(p.id) AS "Número de Posts"
FROM posts p
  LEFT JOIN topics t ON t.id = p.topic_id
WHERE t.archetype <> 'private_message'
  AND t.deleted_at ISNULL
  AND p.deleted_at ISNULL
  AND p.post_type = 1
  AND p.user_id > 0
GROUP BY 1
ORDER BY 2 DESC
LIMIT 10

Esta es solo una consulta simple para demostrar los ejemplos, pero espero que esto te ayude a empezar con el explorador de datos. :+1: Si tienes alguna pregunta, por favor, hazla a continuación. :slight_smile:

10 Me gusta

¿Te refieres a mensajes aquí?

cualquier publicación, o publicaciones de […]

me suena raro.

¿Tú tampoco lo crees? Pretende indicar que las publicaciones que están en temas eliminados no se incluyen. Usar “mensajes” hace que suene como si se refiriera a mensajes privados. Pero volveré a examinar cómo describirlo más claramente. :+1:


Otra idea:

Incluir AND p.post_type = 1 también podría ser una buena inclusión para este. :thinking:

1 me gusta

Pensé que podría ser porque también filtra los mensajes privados y

excluye mensajes, publicaciones eliminadas y publicaciones de temas eliminados.

Tiene más sentido para mí que

excluir publicaciones o publicaciones de temas que han sido eliminados.

Releyéndolo ahora, sí veo cuál era la intención original, así que está ahí, solo que no tan claro como esperaba, supongo. :person_shrugging:

1 me gusta