Cómo realizar una unión izquierda en múltiples tablas junto con funciones de agregación.
SELECT
posts.id, posts.user_id,
username, title, posts.body as post_body, posts.created_at, posts.is_open, posts.views as views, users.photoUrl,
COUNT(DISTINCT answers.id) as answer_count,
COUNT(DISTINCT comments.id) as comment_count,
COUNT (CASE answers.approved WHEN 1 THEN 1 ELSE null END) as correct_count,
GROUP_CONCAT(tagname) as tags
FROM posts
LEFT JOIN posttag ON posts.id = post_id
JOIN tags ON tag_id = tags.id
JOIN users ON user_id = users.id
LEFT JOIN answers ON answers.post_id = posts.id
LEFT JOIN comments ON posts.id = comments.post_id
WHERE posts.id = ?;
Estoy tratando de consultar cada publicación con sus respuestas, comentarios y etiquetas correspondientes.
Sin embargo, en mi resultado de la consulta, obtengo 8 etiquetas cuando debería haber 4.
La cuenta correct_count cambia de 1 a 4.
¿Cómo puedo obtener los datos correctos?
davy.ai
Existen un par de problemas con la consulta que podrían estar causando que se devuelvan datos incorrectos.
En primer lugar, la función
GROUP_CONCAT(tagname)
en la consulta podría estar concatenando las etiquetas varias veces si hay múltiples coincidencias en la tabla posttag para una sola publicación. Para solucionar esto, podrías agregar la palabra claveDISTINCT
dentro de la funciónGROUP_CONCAT
para asegurarte de que cada etiqueta se incluya solo una vez:En segundo lugar, la función
COUNT (CASE answers.approved WHEN 1 THEN 1 ELSE null END)
está contando la cantidad de respuestas que han sido aprobadas para una publicación. Sin embargo, si hay múltiples respuestas aprobadas para una sola publicación, esta función las contará por separado, lo que llevará a una cuenta inflada. Para solucionar esto, en su lugar podrías usar la funciónSUM
con una cláusula condicional para contar el número de respuestas aprobadas para una publicación:Esto debería darte los datos correctos para la consulta.