MySQL: El número de comentarios
25.abr 2008
Envía un trackback
Si un post pudiera tener asociadas N categorías y a su vez M comentarios sería un super-post. Y si todo ello pretende estar normalizado en una base de datos relacional, con sus tablas independientes, sus keys y sus índices... ¡a quién no le gustaría ser post!.
El problema viene cuando un programador pretende sacar en la misma consulta -por aquello de no ahogar más si cabe el cuello de botella- los datos principales del post y el número de comentarios que tiene. Todo ello perteneciente a una categoría -category_id=9 en el ejemplo-. Pónganse los cinturones.
Opción 1
Sin mucho pensar y abordando el tema desde la poca experiencia que me aportan los JOIN:
SELECT posts.*, count(comments.id) AS cuenta
FROM posts
LEFT JOIN comments
ON comments.post_id = posts.id
LEFT JOIN posts_categories
ON posts.id = posts_categories.post_id
WHERE posts_categories.category_id = 9
GROUP BY posts.id ORDER BY id DESC
Después de la adrenalina inicial y haciendo algunas pruebas me doy cuenta de que no funciona (al menos no sirve para solucionar el problema)... descartada.
Opción 2
La que -rotulador en mano- pensó minuciosamente mi compañero Mamel:
SELECT p.*, cuenta
FROM posts_categories pc
LEFT JOIN
(
posts p
LEFT JOIN
(
SELECT count(*) AS cuenta, post_id
FROM comments
WHERE post_id IN
(
SELECT post_id
FROM posts_categories
WHERE posts_categories.category_id = 9
)
GROUP BY post_id
) c
ON c.post_id = p.id
) p
ON pc.post_id = p.id
WHERE pc.category_id = 9;
Todo parecía ir bien hasta que probamos con un post sin comentarios. Semi-descartado.
Opción 3
Lo más sencillo sería guardar el número de comentarios directamente en la tabla de posts, ahorrando tiempo, código y ciclos de reloj. Merece la pena modificar el fuente existente para adecuarse a la nueva situación.Nota mental
Enlaces toread sobre joins y full text search (que no viene al caso pero me apetece leer):- Lectura obigada sobre JOINS
- Más sobre JOINS
- MySQL con Clase
- MySQL Full Text Search functions
- Full Text Search
- Spanish Stopwords
- Más full search
Comentarios
Sería lo más fácil pero no lo correcto, porque siempre se dice que en una tabla 'bien' normalizada no deben aparecer campos calculados.
Correcto coder, pero no siempre lo normalizado es lo mejor (sobre todo hablando de MySQL y optimización). Es una balanza complicada de equilibrar, la verdad.
Escribe tu comentario
Intenta que tu comentario sea interesante y con información relevante al tema de la entrada. BBCodes disponibles:
[url=http://direccion]texto[/url], negrita: [b]texto[/b],
itálica: [i]texto[/i], subrayada: [u]texto[/u].
Para mencionar o citar a alguien (quote): [cita]texto[/cita]


