2013-02-21 9 views
5

Pracuję z tabeli (Wyniki), który ma następującą strukturę (nie pytaj, nie budować)MySql UPDATE z SUM w tej samej tabeli

id | record_type | user_id | answer_id | choice | score | total | email 
------------------------------------------------------------------------------- 
1 email   xxxxxxx         0  [email protected] 
2 answer  xxxxxxx aaaaaa  A  0 
3 answer  xxxxxxx bbbbbb  A  0 
4 answer  xxxxxxx cccccc  B  10 
5 email   yyyyyyy         0  [email protected] 
6 answer  yyyyyyy aaaaaa  A  0 
7 answer  yyyyyyy bbbbbb  A  0 
8 answer  yyyyyyy cccccc  A  0 
9 email   zzzzzzz         0  [email protected] 
10 answer  zzzzzzz aaaaaa  A  0 
11 answer  zzzzzzz bbbbbb  A  0 
12 answer  zzzzzzz cccccc  B  10 

Jest to badanie i wartości wyników poprawnych odpowiedzi uległy zmianie po przesłaniu ankiet. Już uruchomiłem aktualizację, aby ustawić wartości punktacji dla "poprawnych" odpowiedzi na 10, a teraz muszę zaktualizować sumę dla rekordów z typem rekordu: e-mail, abyśmy mogli skontaktować się ze zwycięzcami.

Celem byłoby ustawić całkowitą kolumnę wierszy 1,5 i 9 będzie 10,0 i 10

mam na myśli coś takiego

UPDATE results SET total = SUM(score) 
FROM results GROUP BY user_id WHERE user_id = user_id 

Ale to nie robi” Wyglądasz dobrze i martwię się, że mogę zejść na złą drogę.

Odpowiedz

8
UPDATE 
     results AS r 
    JOIN 
     (SELECT user_id, 
        SUM(score) AS sum_score 
      FROM  results 
      WHERE record_type = 'answer' 
      GROUP BY user_id 
     ) AS grp 
     ON 
      grp.user_id = r.user_id 
SET 
     r.total = grp.sum_score 
WHERE 
     r.record_type = 'email'; 

dotyczące wydajności, wskaźnik na (record_type, user_id, score) pomogłoby zarówno skutecznie obliczyć tabelę pochodzącą iz samosprzężenie.

+0

to działa. Bardzo dobrze. Dziękuję Ci. – byron

+0

Pytanie dla was ... Używam tego na stole z ~ 400 tys. Wierszy i się zawiesza (prawdopodobnie brakuje pamięci). Wszelkie sugestie do rozwiązania? Jak, sposób uruchomienia zapytania w porcjach? – byron

+0

Może to wyglądać na "skomplikowane", ale w rzeczywistości jest łatwe do zrealizowania i działa jak marzenie (potrzebujesz unikalnego indeksu, który musiałem utworzyć, aby spełnić moje wymagania) – zzapper

3

Jesteś prawie na miejscu.

UPDATE results r SET total = 
    (select SUM(score) FROM results r2 
    WHERE r2.user_id = r.user_id 
    and r2.record_type = 'answer') 
where r.record_type = 'email'; 

To powinno działać

+1

Nie będzie działać na serwerze MySQL. http://stackoverflow.com/questions/653826/update-with-sum-in-mysql – Kamil

+1

Zwraca 'Kod błędu: 1093. Nie można określić tabeli docelowej 'r' dla aktualizacji w klauzuli FROM" – Kamil

+0

Wow, pracował dla mojej sprawy. Ci, którzy powiedzieli, że to nie działa, czy po prostu zmienilibyście to, by pasowało do waszej sprawy? –

-2

Witam Po zgłoszeniu aktualizacji, ale wystąpił błąd Missing set key word.

Poniżej znajduje się instrukcja aktualizacji.

UPDATE IFRS_SIT_USER.t_318038 AS r 
    JOIN 
     (SELECT business_unit, Report_no, Y_Ordinate, 
          SUM(Calc_Permata_amt) AS sum_calc_amt 
      FROM IFRS_SIT_USER.t_318038 
      WHERE business_unit = 'DA-01-PERMATA' and Report_no='F 12.00' and asof_date='31-Mar-2017' 
      GROUP BY Y_Ordinate, business_unit, Report_no 
) AS grp 
     ON 
      grp.Y_Ordinate= r.Y_Ordinate 
SET 
     r.Fnl_Calc_Permta_amt=grp.sum_calc_amt 
WHERE 
     r.business_unit = 'DA-01-PERMATA' and r.Report_no='F 12.00' and r.asof_date='31-Mar-2017' 
+0

Prosimy o pomoc – user8841680

+0

Jeśli masz nowe pytanie, zadaj je, klikając przycisk [Zadaj pytanie] (https://stackoverflow.com/questions/ask). Dodaj link do tego pytania, jeśli pomoże to w zapewnieniu kontekstu. - [Z recenzji] (/ opinia/niskiej jakości-posts/17753695) – Oleg