MySQL / SQL: actualización con subconsulta correlacionada de la tabla actualizada
-
22-07-2019 - |
Pregunta
Tengo una pregunta genérica que intentaré 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 proporción debe incluir el porcentaje de las apariencias de cada elemento del número total de apariciones de elementos en la categoría.
En pseudocódigo, lo que necesito es lo siguiente:
Para cada categoría
encuentre la suma total de las apariencias de los artículos relacionados Por ejemplo, se puede hacer con (select sum (" apariencias ") del grupo de tablas por categoría
)Para cada elemento
establecer el valor de la proporción como las apariencias del elemento 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 deberí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.
¿Alguna idea?
Solución
Siguiendo 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 subconsultas correlacionadas, pero fue mucho más lento (órdenes de magnitud), así que me quedo con la unión.
Otros consejos
Usar combinaciones justo después de ACTUALIZAR: Manual de referencia - 13.2.11 ACTUALIZAR Sintaxis
entonces ACTUALIZAR tabla1 tabla de unión interna2 en ... establecer table1.foo = valor 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;)
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