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

r0sk 25.Apr.2008 2 Comentarios 1623 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.

Escribe un comentario

Nick
Email
URL

Buscar

Cargando...

Categorías

Últimos comentarios

  • BartlettLilly20
  • r0sk
  • coder
  • argordmel
  • uveic
  • MarcosBL
  • quemada
  • alexander
  • Hakky111
  • tramel
  • hoyadas
  • hoyadas
  • hoyadas
  • Anubys
  • Arturo

Tagcloud

lugo freebsd seguridad futbol iphone mysql champions userlinux alemania_2006 copa bsd cakephp rfilms deportes meme blogs conciertos bake debian macosx apple humor programación música games 2008 beers tip lucux cake sysadmin ssh ibook films cumpleaños bash league barça soccer mundial frases opinion felicidades hack php juegos cms personal 2007 ubuntu ds mac sidenotes openbsd linux blogsfera rsidenotes blog nintendo san_froilan

Archivo

Social

Twitter

Enlaces

Enlaces de interés