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?

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top