Frage

Ich habe eine allgemeine Frage, dass ich ein Beispiel zu erklären versuchen, verwendet wird.

Sagen wir, ich habe eine Tabelle mit den Feldern: "id", "name", "Kategorie", "Erscheinungen" und "Verhältnis"

Die Idee ist, dass ich mehrere Elemente, die jeweils im Zusammenhang mit einer einzigen Kategorie und „erscheint“ mehrmals. Das Verhältnis Feld soll den Anteil der einzelnen Erscheinungen des Elements ist aus der Gesamtzahl der Erscheinungen der Elemente in der Kategorie.

In Pseudo-Code, was ich brauche, ist die folgende:

  • Für jede Kategorie
    finden die Gesamtsumme der Einsätze für Gegenstände mit sich bringen. Zum Beispiel kann es mit (select sum("appearances") from table group by category) erfolgen

  • Für jedes Element
    stellen Sie den Verhältniswert als das durch die Summe für die Kategorie eingeteilt Erscheinungen Stück oberhalb

Jetzt versuche ich dies mit einer einzigen Update-Abfrage zu erreichen, aber kann nicht scheinen, es zu tun. Was ich dachte, ich tun soll, ist:

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

Aber MySQL nicht akzeptieren, die Alias-T in der Update-Spalte, und ich fand nicht, andere Wege, dies zu erreichen.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Im Anschluss an die beiden Antworten, die ich erhielt (von denen keines vollständig war, damit ich meine eigene geschrieben hat), was ich tat, schließlich ist wie folgt:

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 

Es funktioniert sehr schnell. Ich habe auch versucht mit korrelierten Unterabfrage, aber es war viel langsamer (Größenordnung), so ich bleibe mit dem verbinden.

Andere Tipps

Verwenden Sie schließt sich direkt nach UPDATE: Referenzhandbuch - 13.2.11 UPDATE Syntax

so UPDATE table1 Exklusionsverknüpfung table2 auf .... set = Wert table1.foo wo table2.bla = someothervalue

Mit dieser Art von Dingen, schaut immer in der Bedienungsanleitung. MySql hat ein richtiges Referenzhandbuch, so sollte es nicht sein, dass schwer, die richtige Syntax zu bekommen;)

Dies ist, wie es in mssql geschehen ist, ich denke, mysql gleich oder ähnlich ist:

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top