gemiddelde berekenen (van IMDb en FT)

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

John de Boer

John de Boer

06/10/2006 00:23:00
Quote Anchor link
Ik wil het gemiddelde berekenen

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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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];
    }
}
...

?>



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
 
PHP hulp

PHP hulp

03/12/2024 18:37:15
 
Kalle P

Kalle P

06/10/2006 00:29:00
Quote Anchor link
Ik weet het alleen van Java. Maar een int is niet bedoeld voor achter de komma's. In Java moet je dan een double gebruiken.

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
 
John de Boer

John de Boer

06/10/2006 00:32:00
Quote Anchor link
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
 
Kalle P

Kalle P

06/10/2006 00:36:00
Quote Anchor link
Dat had ik niet gezien. Maar ik denk dat je het iets van DECIMAL moet nemen, ik weet het niet precies. Kijk eens via die link die ik gezet heb bij mijn edit van vorige post.

Je ziet zelf dat ik ie va 5.8 --> 5 maakt.
5*1554 = 7000
 
Robert Deiman

Robert Deiman

06/10/2006 08:46:00
Quote Anchor link
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)
 
Joren de Wit

Joren de Wit

06/10/2006 10:02:00
Quote Anchor link
Om zowel alle cijfers en votes als de gemiddelden op te halen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
 
Robert Deiman

Robert Deiman

06/10/2006 10:12:00
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


Comma's toegevoegd, die moeten er wel bij bij het selecteren van meerdere kolommen :)
 
Joren de Wit

Joren de Wit

06/10/2006 10:16:00
Quote Anchor link
Juist, helemaal gelijk ;)
 
John de Boer

John de Boer

13/10/2006 19:14:00
Quote Anchor link
Als ik deze SQL

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;


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
 
Frank -

Frank -

13/10/2006 20:13:00
Quote Anchor link
Offtopic: Wat doen die VARCHAR's in dit datamodel? Je bent bezig met getallen, dus lijken mij VARCHAR's niet op zijn plaats. Dit zullen INT's of een DECIMAL's moeten worden, wil je een goed datamodel gebruiken.

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 Deiman

Robert Deiman

13/10/2006 20:21:00
Quote Anchor link
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)


Die tip over AVG had ik ook al gedaan, hier dus nog een keer maar dan tussen code tags:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT AVG(IMDb_cijfer + FT_cijfer)/2 AS gemiddeld
 
John de Boer

John de Boer

13/10/2006 20:40:00
Quote Anchor link
De laatste SQL levert geen goeie gemiddelde op, alleen van de 2 cijfers maar dan worden de stemmen dus niet meegerekent en geeft dus een verkeerd beeld!

@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
 
Frank -

Frank -

13/10/2006 20:52:00
Quote Anchor link
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.
 
John de Boer

John de Boer

13/10/2006 21:18:00
Quote Anchor link
Dat klopt, ik exporteer de Access-db naar een .CSV-bestand en die importeer ik dan via MySQL-Front in MySQL.

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
 
Robert Deiman

Robert Deiman

13/10/2006 22:57:00
Quote Anchor link
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.
 
John de Boer

John de Boer

13/10/2006 23:19:00
Quote Anchor link
Dat is niet helemaal wat ik bedoelde.
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
 
Robert Deiman

Robert Deiman

13/10/2006 23:31:00
Quote Anchor link
Ooh, ik zie het, sorry foutje van mij, ik heb daarvoor nu deze ingewikkelde rekenmethode gebruikt, nog niet getest.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
 
John de Boer

John de Boer

14/10/2006 17:47:00
Quote Anchor link
Je berekening klopt niet helemaal, het gemiddelde is bij de meeste ruim meer dan het IMDb_cijfer en/of FT_cijfer

Mijn SQL ziet er nu zo uit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
 
John de Boer

John de Boer

14/10/2006 17:47:00
Quote Anchor link
Je berekening klopt niet helemaal, het gemiddelde is bij de meeste ruim meer dan het IMDb_cijfer en/of FT_cijfer

Mijn SQL ziet er nu zo uit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;


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
 
Robert Deiman

Robert Deiman

14/10/2006 17:50:00
Quote Anchor link
Zo dan, ik had geloof ik een paar haakjes niet helemaal goed staan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT ((SUM(IMDb_cijfer*IMDb_votes)) + (SUM(FT_cijfer*FT_votes)))/(SUM(FT_votes )+SUM(IMDb_votes)) AS gemiddelde
 
John de Boer

John de Boer

14/10/2006 17:53:00
Quote Anchor link
Dan zegt hij
"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...
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.