2011-05-26 10 views
12

Hola chicos Tengo las siguientes tablas de configurar:¿Actualizar una columna con un COUNT de otros campos es SQL?

Articles: 
ID | TITLE | CONTENT | USER | NUM_COMMENTS 

COMMENTS 
ID | ARTICLE_ID | TEXT 

Necesito una instrucción SQL que actualiza el campo NUM_COMMENTS de la tabla de artículos con teh la cuenta de las observaciones formuladas en contra del artículo como:

update articles a, comments f 
set a.num_comments = COUNT(f.`id`) 
where f.article_id = a.id 

El sql anterior no funciona y recibo un error de la función Usar el grupo fo no válido. Estoy usando MySQL aquí.

+0

¿Por qué exactamente quieres guardar esa información en tu tabla de artículos? ¿Has considerado contar los comentarios cada vez que necesitas esa información? De esta forma evitará tener información duplicada en su esquema de base de datos. – plang

+0

Bueno, la tabla de artículos es enorme y quiero evitar tener que unirme porque también tengo que ordenar los artículos según lo que más se comenta. – Ali

+0

Ok, entonces otra opción para ti es algún tipo de "vista materializada". – plang

Respuesta

24

No puede tener una unión en una declaración de actualización. Debe ser

update articles 
set num_comments = 
(select count (*) from comments 
where comments.article_id = articles.id) 

Esto actualizará la tabla de artículos completos, que puede no ser lo que usted desea. Si tiene la intención de actualizar solo un artículo, agregue una cláusula 'where' después de la subconsulta.

+0

Solo tenga en cuenta que puede unirse a una actualización si alias la tabla que se actualizará - ver http://stackoverflow.com/questions/1293330/sql-update-with-join – StuartLC

8

Esto debería funcionar.

UPDATE articles a SET num_comments = 
(SELECT COUNT(*) FROM comments c WHERE c.article_id = a.id) 

pero preferiría actualizar sólo un registro cuando ha sido publicado:

UPDATE articles a SET num_comments = 
(SELECT COUNT(*) FROM comments c WHERE c.article_id = 100) WHERE a.id = 100 
+0

Estará ejecutando esta consulta de actualización una vez cada pocas horas a través de un trabajo cron aunque – Ali

-2

que no puede hacerlo de una manera interna genérica unirse. pero se puede hacer de otra manera por:

1- Seleccionar todos los identificadores de la tabla artículos

2- iterar ellos y ejecutar el siguiente comando

artículos de actualización del conjunto NUM_COMMENTS = (select count (id) de los comentarios donde id = $ id) donde id = $ id

para mejorarlo más, en la primera selección no seleccione todos los valores, especialmente cuando esa tabla es demasiado grande, necesita iterar los artículos y obtener 1000 registros por iteración. De esta forma, mantendrá un hilo de base de datos saludable desde su grupo de bases de datos y también ahorrará ancho de banda.

0

Para actualización basada en una columna de contar solo, usted podría hacer algo como:

update articles, (select count (*) from comments where comments.article_id = articles.id) as newtotals set articles.num_comments = newtotals.count;

o ... si has tenido una situación que requiere el recuento de rodadura:

update articles, (select (count (*)) + (articles.num_comments) as count from comments join articles on comments.article_id = articles.id group by articles.id) as newtotals set articles.num_comments = newtotals.count;

Cuestiones relacionadas