MySQL: El número de comentarios - Userlinux.net

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…

MySQL: El número de comentarios

25.Apr.2008 ~ 2 Comentarios ~ 2654 Lecturas
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):
Categorías: programación

Comentarios


gravatar
29.Apr.2008
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.

gravatar
29.Apr.2008
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.

Comentarios


Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 15 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Buscar

Cargando...

Últimos comentarios

  • reidrac
  • r0sk
  • Rodrigo Rega
  • minWi
  • r0sk
  • reidrac
  • r0sk
  • deady
  • errece
  • r0sk
  • flexo
  • r0sk
  • MarcosBL
  • r0sk
  • isra

Moneting

Valor de mi cuenta de Facebook según Moneting
Valor de mi cuenta de Twitter según Moneting

Tagcloud

bake ubuntu blogsfera ps3 barça programación conciertos freebsd twitt mundial macosx frases lugo nintendo deportes futbol software iphone vacaciones blog ds league canción opinion juegos cake seguridad champions games linux hack 2008 mac alemania_2006 web bash cumpleaños lucux mysql humor bsd userlinux sysadmin cakephp ssh openbsd 2007 django films personal rfilms apple felicidades blogs debian meme php rsidenotes twitter sidenotes

Archivo

Social

Enlaces de interés