2009-08-01 19 views
23

Tengo 2 tablas/entidades, escenario muy sencillo.MySQL: Contar los registros de una tabla y luego actualizar otra

Tabla poetas - Columnas: ID, poeta, nación

Tabla naciones - Columnas: ID, nación, recuento

Básicamente, naciones a poetas tiene un mapeo de uno para muchos, naturalmente Por ejemplo, hay 1000 poetas de 60 naciones. Cada poeta en poetas se asigna a una nación por el campo nación que contiene la identificación de una de las naciones en naciones.

El campo de recuento de naciones contiene el número de poetas en poetas de esta nación.

Mi pregunta es cómo usar solo una consulta SQL para contar el número de poetas por nación en poetas y luego actualizar el conteo correspondiente de esa nación?

me trataron:

UPDATE poets, nations SET nations.count = COUNT(poets.id) GROUP BY poets.nation HAVING poets.nation = nations.id 

pero da # 1064 de error. También intenté combinar la cláusula WHERE en alguna parte, pero todavía se niega a funcionar.

¿Alguna idea?

Respuesta

32

utilizar una subconsulta:

UPDATE nations 
    SET count = (
     SELECT COUNT(id) 
     FROM poets 
     WHERE poets.nation = nations.id 
     GROUP BY id 
     ); 
+0

¡Gracias, eso funciona! –

+6

tenga en cuenta que para tablas muy grandes (más de 500,000 registros) esto podría ser muy lento. – dusoft

+0

Además, si naciones.count no puede contener nulos, esto puede generar advertencias. Use un IFNULL para protegerse de esto. ACTUALIZAR naciones SET count = IFNULL ((SELECT COUNT (id) FROM poetas WHERE poetas.nation = nations.id GROUP BY id), 0); –

18

Uno no necesita GROUP BY, cf .:

UPDATE nations SET count = (
    SELECT COUNT(id) FROM poets 
    WHERE poets.nation = nations.id); 

O, mejor dicho, con GROUP BY, la subconsulta devolverá NULL para las naciones que no tienen poetas. Sin GROUP BY, la subconsulta devolverá 0 en este caso.

+0

nulo/0 diferencia con/sin grupo por - esto ayudó. Gracias –

Cuestiones relacionadas