Comunidad de diseño web y desarrollo en internet online

Unir consulta COUNT a otra tabla

Citar            
MensajeEscrito el 28 Abr 2012 02:07 pm
Hola a todos.

Tengo dos tablas. Una se llama noticias y la otra comentarios.

Quisiera realizar una consulta en la que me salgan los datos de la tabla noticias y el número de comentarios de cada noticia.

Lógicamente como es normal cada entrada de la tabla comentarios guarda la id de la tabla noticias.

Por ejemplo si realizo la consulta:
SELECT COUNT(idcomentarios) FROM comentarios GROUP BY idcomentarios

Me muestra el número de veces que un mismo id se repite.

Bueno pues me gustaría poder unir esa consulta a la típica
SELECT * FROM noticias

En la que por cada id de noticias se referencia el COUNT de la otra consulta.

Creo que se hace con inner join, pero no logro aclararme...

Por curioso

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 28 Abr 2012 03:25 pm
Prueba lo siguiente:

Código MySQL :

SELECT `noticias`.`id`, COUNT(`comentarios`.`idcomentarios`) AS `cuenta`
FROM `comentarios`, `noticias`
WHERE `noticias`.`id` = `comentarios`.`idnoticias`
GROUP BY `comentarios`.`idcomentarios`

Suponiendo que la tabla "noticias" tenga un campo "id" que es el identificador único de la noticia y la tabla "comentarios" tenga un campo "idnoticias" que apunta al id de "noticias".

Por DriverOp

Claber

2510 de clabLevel



 

opera
Citar            
MensajeEscrito el 28 Abr 2012 04:25 pm
Hola DriverOp.

Tu consulta me va genial. Muchas gracias.

Solo un detalle. Con esta consulta solo se me muestra las noticias que tienen algún comentario y la cantidad de comentarios, pero a mi me interesa que salgan todas noticias tengan o no tengan comentarios y si los tienen indicar cuantos (esa parte ya me la has resuelto jeje).
He mirado de modificarla pero no lo he logrado...
He probado a quitar el where, ya que he visto que había una relación con las id, pero no he logrado más que me muestre unos resultados extraños que nada tienen que ver con lo que busco.

Si puedes echarme una mano de nuevo, por favor.

Por curioso

8 de clabLevel



 

firefox
Citar            
MensajeEscrito el 28 Abr 2012 09:55 pm
Parece que no tienes mucha idea de cómo funcionan las consultas SQL. No te preocupes, nadie nace sabiendo.
Lo que me extraña es que no sepas la teoría de bases de datos relacionales. La cláusula WHERE es la que te permite asociar las claves locales de los registros con las claves foráneas de la tabla asociada en una relación uno a muchos. Es lo que te permite saber dada una noticia cuáles son sus comentarios.

Lo que quieres ahora es más complicado puesto que habrá noticias que no tienen comentarios y por tanto en la tabla foránea de la relación no habrá registros qué relacionar. Es decir, lo que quieres es la unión más el complemento de una de las tablas (teoría de conjuntos ¿alguien?).

En SQL para hacer eso debes usar la cláusula JOIN que te trae la unión (es igual al WHERE de la consulta que ya viste), pero además de la unión quieres el complemento de la tabla de la izquierda, es decir LEFT JOIN.

La consulta que quieres iría más o menos así:

Código MySQL :

SELECT `noticias`.`id`, COUNT(`com`.`id`) AS `cuenta` FROM
`noticias`
LEFT JOIN `comentarios` `com` ON `com`.`idnoticias` = `noticias`.`id`
GROUP BY `noticias`.`id`
ORDER BY `cuenta` DESC

La cláusula GROUP BY agrupa todos los id de los comentarios para que COUNT pueda contarlos, en el caso del complemento de la tabla noticias (es deicr, las noticias que no tienen comentarios), no habrá ids de comentarios qué contar y por lo tanto COUNT contará cero que es lo que quieres obtener ;).

El ORDER BY es de mi propia cosecha porque me parece que lo quieres mostrar en ese orden.

Saludos.

Por DriverOp

Claber

2510 de clabLevel



 

opera

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.