gemiddelde berekenen (van IMDb en FT)
Ik heb de volgende velden in mijn mysql-db:
`IMDb_cijfer` varchar(5) default NULL,
`IMDb_votes` int(11) unsigned default NULL,
`FT_cijfer` varchar(5) default NULL,
`FT_votes` int(11) unsigned default NULL,
en nu wil ik dus het gemiddelde berekenen van het IMDb- en FT-cijfer op deze manier:
(IMDb_cijfer * IMDb_votes) + (FT_cijfer * FT_votes) / (IMDb_votes + FT_votes)
Ik heb de volgende php-code daarvoor:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
...
// $row[28] = IMDb_cijfer, $row[29] = IMDb_votes, $row[31] = FT_cijfer, $row[32] = FT_votes
$total = 0; $votes = 0; $IMDbtotal = 0; $FTtotal = 0; // zet alles op 0
if (empty($row[31])) { // als FT-cijfer leeg is...
if ( !empty($row[28]) && !empty($row[29]) ) {
$IMDbtotal = $row[28] * $row[29];
settype($IMDbtotal,"integer");
$avg = $row[28];
}else{
$avg = "";
}
}else{ // FT-cijfer is niet leeg...
if (!empty($row[28])) {
$IMDbtotal = $row[28] * $row[29];
$FTtotal = $row[31] * $row[32];
$total = $IMDbtotal + $FTtotal;
$votes = $row[29] + $row[32];
$avg = $total / $votes;
}else{
$avg = $row[31];
}
}
...
?>
...
// $row[28] = IMDb_cijfer, $row[29] = IMDb_votes, $row[31] = FT_cijfer, $row[32] = FT_votes
$total = 0; $votes = 0; $IMDbtotal = 0; $FTtotal = 0; // zet alles op 0
if (empty($row[31])) { // als FT-cijfer leeg is...
if ( !empty($row[28]) && !empty($row[29]) ) {
$IMDbtotal = $row[28] * $row[29];
settype($IMDbtotal,"integer");
$avg = $row[28];
}else{
$avg = "";
}
}else{ // FT-cijfer is niet leeg...
if (!empty($row[28])) {
$IMDbtotal = $row[28] * $row[29];
$FTtotal = $row[31] * $row[32];
$total = $IMDbtotal + $FTtotal;
$votes = $row[29] + $row[32];
$avg = $total / $votes;
}else{
$avg = $row[31];
}
}
...
?>
Alleen als IMDb-cijfer bijv. 5.8 is met 1554 votes dan wordt $IMDbtotal = 7770, en dat moet dus 9013.2 zijn...
Gewijzigd op 01/01/1970 01:00:00 door John de Boer
edit:
http://www.google.nl/search?hs=gxv&hl=nl&client=firefox-a&rls=org.mozilla%3Anl%3Aofficial&q=mysql+decimal&btnG=Zoeken&meta=
Ik denk dat je het anders moet noemen en het geen INT noemen, want die leest de komma's niet.
Gewijzigd op 01/01/1970 01:00:00 door Kalle P
Kalle:
Ik denk dat je het anders moet noemen en het geen INT noemen, want die leest de komma's niet.
alleen de votes zijn een int en dat zijn altijd hele getallen... je hebt immers ook geen halve personen of kwart personen...
de cijfers kunnen van 1.0 oplopen tot 10, met tussenpozen van 0.1
Gewijzigd op 01/01/1970 01:00:00 door John de Boer
Je ziet zelf dat ik ie va 5.8 --> 5 maakt.
5*1554 = 7000
onderstaand is een "hersenspinseltje" en is niet getest:
SELECT AVG(IMDb_cijfer + FT_cijfer)/2 AS gemiddeld
(het gemiddelde van IMDb_cijfer + FT_cijfer geeft de som van het gemiddelde IMDb_cijfer en het gemiddelde FT_cijfer, dus moet ook door 2 worden gedeeld)
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
SELECT
IMDB_cijfer AS ic,
IMDB_votes AS iv,
FT_cijfer AS fc,
FT_votes AS fv,
((ic*iv)+(fc*fv))/(iv+fv) AS gemiddeld
FROM
tabel
ORDER BY
gemiddeld DESC
IMDB_cijfer AS ic,
IMDB_votes AS iv,
FT_cijfer AS fc,
FT_votes AS fv,
((ic*iv)+(fc*fv))/(iv+fv) AS gemiddeld
FROM
tabel
ORDER BY
gemiddeld DESC
Comma's toegevoegd, die moeten er wel bij bij het selecteren van meerdere kolommen :)
Juist, helemaal gelijk ;)
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
SELECT
IMDb_cijfer AS ic,
IMDb_votes AS iv,
FT_cijfer AS fc,
FT_votes AS fv,
((ic*iv)+(fc*fv))/(iv+fv) AS gemiddeld
FROM
filmarchief
ORDER BY
gemiddeld DESC;
IMDb_cijfer AS ic,
IMDb_votes AS iv,
FT_cijfer AS fc,
FT_votes AS fv,
((ic*iv)+(fc*fv))/(iv+fv) AS gemiddeld
FROM
filmarchief
ORDER BY
gemiddeld DESC;
in MySQL-Front invoer krijg ik de melding
"Onbekende kolom 'ic' in field list"
Gewijzigd op 01/01/1970 01:00:00 door John de Boer
Ontopic: MYSQL staat het niet toe om de aliasen te gebruiken. ic moet dus worden IMDb_cijfer, etc.
Maar waarom ga je niet met AVG() aan de slag? Zie hoofdstuk 12 van de MySQL-handleiding voor de vele handige functies.
Robert schreef op 06.10.2006 08:46:
Kan dat niet in MySQL zelf dan, in de SELECT query,
onderstaand is een "hersenspinseltje" en is niet getest:
SELECT AVG(IMDb_cijfer + FT_cijfer)/2 AS gemiddeld
(het gemiddelde van IMDb_cijfer + FT_cijfer geeft de som van het gemiddelde IMDb_cijfer en het gemiddelde FT_cijfer, dus moet ook door 2 worden gedeeld)
onderstaand is een "hersenspinseltje" en is niet getest:
SELECT AVG(IMDb_cijfer + FT_cijfer)/2 AS gemiddeld
(het gemiddelde van IMDb_cijfer + FT_cijfer geeft de som van het gemiddelde IMDb_cijfer en het gemiddelde FT_cijfer, dus moet ook door 2 worden gedeeld)
Die tip over AVG had ik ook al gedaan, hier dus nog een keer maar dan tussen code tags:
@Frank
Het was de enigste manier dat ik het over kon zetten van Access naar (my)sql, maar ik zal het nog eens proberen met INT of DECIMAL
Waarschijnlijk heb je geen scriptje geschreven dat de data vanuit Access ophaalt en zelf keurig in MySQL wegschrijft. Wanneer je dat doet, zorg je er voor dat jouw datamodel in MySQL goed is en jouw php-script de juiste notaties e.d. hanteert. Je hebt dan geen enkele afhankelijkheid van Access of welk ander formaat dan ook.
EDIT:
DECIMAL(3,1) heb ik nu als datatype voor de cijfers :-)
(de cijfers kunnen lopen van 1.0 tot en met 10)
Gewijzigd op 01/01/1970 01:00:00 door John de Boer
Als je bedoelt dat de AVG functie van mij geen goed gemiddelde berekend, is er volgens mij iets mis met je database(opzet). Ik heb het hier lokaal zo getest, met een paar waarden en ik kwam precies op het gemiddelde uit.
Ik bedoelde dat het geen goed gemiddelde oplevert omdat jij de stemmen (votes) zo niet meeberekent, en die zijn hierbij wel van belang.
dit moet het gemiddelde zijn:
(IMDb_cijfer * IMDb_votes) + (FT_cijfer * FT_votes)
------------------------------------------------------------
(IMDb_votes + FT_votes)
Gewijzigd op 01/01/1970 01:00:00 door John de Boer
Code (php)
1
SELECT ((SUM(IMDb_cijfer*IMDb_votes)) + (SUM(FT_cijfer*FT_votes)/(SUM(FT_votes )))+SUM(IMDb_votes)) AS gemiddelde
Gewijzigd op 01/01/1970 01:00:00 door Robert Deiman
Mijn SQL ziet er nu zo uit:
Mijn SQL ziet er nu zo uit:
Code (php)
1
2
3
4
2
3
4
SELECT Titel, IMDb_cijfer, FT_cijfer, ((SUM(IMDb_cijfer*IMDb_votes)) + (SUM(FT_cijfer*FT_votes)/(SUM(FT_votes)))+SUM(IMDb_votes)) AS gemiddelde
FROM filmarchief
GROUP BY filmarchief.IMDb_cijfer
ORDER BY IMDb_cijfer DESC, FT_cijfer DESC;
FROM filmarchief
GROUP BY filmarchief.IMDb_cijfer
ORDER BY IMDb_cijfer DESC, FT_cijfer DESC;
Volgens mij is het nog steeds beter om het met PHP te doen, aangezien beide cijfers ook wel eens leeg of 0 kunnen zijn
Gewijzigd op 01/01/1970 01:00:00 door John de Boer
"Something is wrong in your syntax bij 'SELECT ((SUM(IMDb_cijfer*IMDb_votes)) + (SUM(FT_cijfer*FT_votes)' in regel 1"
ik zal me nog eens verdiepen in de functie SUM()
Dat je al sum gebruikt bij een vermenigvuldiging...