varios update tipos tablas tabla subconsultas subconsulta registros otra ejemplo datos con anidado actualizar mysql sql sql-update correlated-subquery

mysql - tipos - update tabla temporal sql server



MySQL/SQL: actualizaciĆ³n con subconsulta correlacionada desde la propia tabla actualizada (3)

Así es como se hace en mssql, creo que mysql es igual o similar:

create table T (id int, ratio float, appearances int) insert T values (1, null, 2) insert T values (1, null, 3) update T set ratio = cast(appearances as float)/ agg.appearancesSum from T join ( select id, sum(appearances) as appearancesSum from T group by id ) as agg on t.id = agg.id

Tengo una pregunta genérica que trataré de explicar usando un ejemplo.

Digamos que tengo una tabla con los campos: "id", "nombre", "categoría", "apariencias" y "ratio"

La idea es que tengo varios elementos, cada uno relacionado con una sola categoría y "aparece" varias veces. El campo de relación debe incluir el porcentaje de apariciones de cada artículo del número total de apariciones de artículos en la categoría.

En pseudocódigo lo que necesito es lo siguiente:

  • Para cada categoria
    Encuentra la suma total de las apariencias para los elementos relacionados con ella. Por ejemplo, se puede hacer con ( select sum("appearances") from table group by category )

  • Para cada articulo
    establezca el valor de relación como las apariencias del artículo dividido por la suma encontrada para la categoría anterior

Ahora estoy tratando de lograr esto con una sola consulta de actualización, pero parece que no puedo hacerlo. Lo que pensé que debía hacer es:

update Table T set T.ratio = T.appearances / ( select sum(S.appearances) from Table S where S.id = T.id )

Pero MySQL no acepta el alias T en la columna de actualización, y no encontré otras formas de lograrlo.

¿Algunas ideas?


Después de las dos respuestas que recibí (ninguna de las cuales estaba completa, así que escribí la mía), lo que finalmente hice es lo siguiente:

UPDATE Table AS target INNER JOIN ( select category, appearances_sum from Table T inner join ( select category as cat, sum(appearances) as appearances_sum from Table group by cat ) as agg where T.category = agg.cat group by category ) as source ON target.category = source.category SET target.probability = target.appearances / source.appearances_sum

Funciona muy rápido. También probé con una subconsulta correlacionada, pero fue mucho más lenta (órdenes de magnitud), así que me quedo con la unión.


Use combinaciones justo después de ACTUALIZAR: Manual de referencia - 13.2.11 Sintaxis de ACTUALIZACIÓN

por lo tanto, UPDATE table1 internal join table2 on .... set table1.foo = value donde table2.bla = someothervalue

Con este tipo de cosas, siempre mire el manual. MySql tiene un manual de referencia adecuado, por lo que no debería ser tan difícil obtener la sintaxis correcta;)