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;)