2010-10-08 18 views
10

Obecnie używam następującą kwerendę, aby uzyskać pewne numery:Ważona średnia kalkulacja w MySQL?

SELECT gid, count(gid), (SELECT cou FROM size WHERE gid = infor.gid)  
FROM infor 
WHERE id==4325 
GROUP BY gid; 

Wyjście ja dostaję w moim obecnym etapie jest następujący:

+----------+-----------------+---------------------------------------------------------------+ 
| gid  | count(gid)  | (SELECT gid FROM size WHERE gid=infor.gid)     | 
+----------+-----------------+---------------------------------------------------------------+ 
|  19 |    1 |               19 | 
|  27 |    4 |               27 | 
|  556 |    1 |               556 | 
+----------+-----------------+---------------------------------------------------------------+ 

Próbuję obliczyć średnią ważoną IE

(1 * 19 + 4 * 27 + 1 * 556)/(19 + 27 + 556)

Czy można to zrobić za pomocą pojedynczego zapytania?

Odpowiedz

13

przeznaczenie:

SELECT SUM(x.num * x.gid)/SUM(x.cou) 
    FROM (SELECT i.gid, 
       COUNT(i.gid) AS num, 
       s.cou 
      FROM infor i 
    LEFT JOIN SIZE s ON s.gid = i.gid 
     WHERE i.id = 4325 
     GROUP BY i.gid) x 
+0

Awesome ... Dziękuję bardzo za to. Miałem zamiar napisać pętlę zagnieżdżoną wewnątrz procedury, ale natrafiłem na artykuł, który powiedział: "Jeśli potrzebujesz zagnieżdżonej pętli, to nie spojrzałeś na JOIN" :) – Legend

+0

@legend: Porada jest poprawna, ale DOŁĄCZY również rekordy zwiększające ryzyko, jeśli z rodzicem powiązane jest więcej niż jedno dziecko. Jeśli chcesz odróżnić wiersze od rodzica, lepiej użyć podkwerendy (EXISTS byłoby moją rekomendacją). –

+0

Rozumiem. W moim przypadku jest dokładnie jeden element, ale będę pamiętać o twoich radach. – Legend

1

Możesz umieścić swoje pierwotne zapytanie jako pod-zapytanie i WYJDŹ rekordy. Nie mogłem przetestować to jak nie mam zestaw danych, co robisz, ale to powinno działać w teorii;)

SELECT SUM(gid)/SUM(weights) AS calculated_average FROM (
    SELECT gid, (COUNT(gid) * gid) AS weights 
    FROM infor 
    WHERE id = 4325 
    GROUP BY gid); 
+0

+1 dla tego podejścia. Dziękuję Ci. Po prostu ciekawy, który z nich jest bardziej wydajny. Wyświetli się napis "WYKONAJ" i zobacz. – Legend

+0

@Legend, bez problemu. Może w rzeczywistości potrzebujesz "DOŁĄCZ", ale z PO, nie widziałem jego konieczności. –