mysql - soporta - update sql
Actualizar una columna con un COUNT de otros campos es SQL? (5)
Hola chicos tengo las siguientes tablas configuradas:
Articles:
ID | TITLE | CONTENT | USER | NUM_COMMENTS
COMMENTS
ID | ARTICLE_ID | TEXT
Necesito una declaración de SQL que actualice el campo NUM_Comments de la tabla de artículos con el recuento de los comentarios realizados contra el 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 función de Grupo de Uso Inválido. Estoy usando MySQL aquí.
Esto debería funcionar.
UPDATE articles a SET num_comments =
(SELECT COUNT(*) FROM comments c WHERE c.article_id = a.id)
Pero prefiero actualizar solo un registro cuando se ha publicado un comentario:
UPDATE articles a SET num_comments =
(SELECT COUNT(*) FROM comments c WHERE c.article_id = 100) WHERE a.id = 100
No puede tener una unión en una declaración de actualización. Debería ser
update articles
set num_comments =
(select count (*) from comments
where comments.article_id = articles.id)
Esto actualizará toda la tabla de artículos, que puede que no sea lo que desea. Si pretende actualizar solo un artículo, agregue una cláusula ''donde'' después de la subconsulta.
No puedes hacerlo de una manera genérica de unión interna. pero puedes hacerlo de otra manera:
1- Seleccionar todos los identificadores de la tabla de artículos.
2- iterarlos y ejecutar el siguiente comando
los artículos de actualización establecen NUM_COMMENTS = (recuento seleccionado (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, debe iterar los artículos y obtener 1000 registros por iteración. De esta manera, mantendrá una base de datos saludable desde su grupo de bases de datos y también ahorrará ancho de banda.
Para actualizar solo en base a un recuento de columnas, 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 tuvo una situación que requería conteos sucesivos:
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;
count (*) puede tener algunos problemas, especialmente con espacios en blanco entre count y (*) ...
por lo que trabajar sql en sqlite, pgsql sería:
update articles
set num_comments =
(select count(id) from comments
where comments.article_id = articles.id)