Domanda

Ho una domanda generica che proverò a spiegare usando un esempio.

Supponi di avere una tabella con i campi: " id " ;, " name " ;, " categoria " ;, " apparenze " e "rapporto"

L'idea è che ho diversi elementi, ognuno relativo a una singola categoria e "appare". parecchie volte. Il campo Rapporto dovrebbe includere la percentuale di apparizioni di ciascun articolo rispetto al numero totale di apparizioni di oggetti nella categoria.

In pseudo-codice ciò di cui ho bisogno è il seguente:

  • Per ogni categoria
    trova la somma totale delle presenze per gli articoli ad essa correlati. Ad esempio, può essere fatto con ( seleziona la somma (" aspetti ") dal gruppo di tabelle per categoria )

  • Per ogni elemento
    imposta il valore del rapporto come aspetti dell'articolo diviso per la somma trovata per la categoria sopra

Ora sto cercando di ottenere questo risultato con una singola query di aggiornamento, ma non riesco a farlo. Quello che pensavo di dover fare è:

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

Ma MySQL non accetta l'alias T nella colonna di aggiornamento e non ho trovato altri modi per raggiungere questo obiettivo.

Qualche idea?

È stato utile?

Soluzione

Seguendo le due risposte che ho ricevuto (nessuna delle quali era completa, quindi ho scritto la mia), quello che alla fine ho fatto è il seguente:

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 

Funziona molto rapidamente. Ho anche provato con una subquery correlata ma era molto più lenta (ordini di grandezza), quindi sto aderendo al join.

Altri suggerimenti

Utilizza i join subito dopo AGGIORNAMENTO: Manuale di riferimento & # 8211; 13.2.11 Sintassi di AGGIORNAMENTO

così AGGIORNA tabella1 join interno tabella2 su .... impostare table1.foo = valore dove table2.bla = someothervalue

Con questo tipo di cose, guarda sempre il manuale. MySql ha un manuale di riferimento adeguato, quindi non dovrebbe essere così difficile ottenere la sintassi corretta;)

Ecco come si fa in mssql, penso che mysql sia uguale o simile:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top