Optellen van records

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Gammele vraal

gammele vraal

27/11/2011 12:56:45
Quote Anchor link
Goede zondag allen,

Ik probeer om scores op te tellen en weer te geven, gesorteerd op ID's uit een array. Deze array split ik zodat ik via een query IN kan filteren.
Wat ik graag zou willen kunnen, is unieke criteria scores weergeven op basis van behaalde resultaten. Zie voor de structuur : http://31.186.169.8/~castilio/dbstructuur.JPG;.

De $items is een array van verschillende resultaat ID's waar ik criteria van wil ophalen. Dus bijvoorbeeld 1,2,3. Vervolgens probeer ik te kijken wat voor criteria hier bij horen en wat te scores zijn. Dit gaat prima. Maar waar het mis gaat, is dat ik dubbele records krijg in plaats van een criteria met een gemiddelde.

Hoe zou ik dit kunnen aanpakken?
Dat ik zeg maar een overzicht krijg met ID's die voorgekomen zijn bij een resultaat en een gemiddelde score (indien een criterium ID vaker voorkomt dan 1x)?

Ik ben al aan de slag geweest, en heb nu het volgende. De ID's worden nu per onderwerp aangegeven, dit is op zich prima.

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
28
29
30
31
32
33
34
35
36
37
38
39
                    //boven worden de datums al gefilterd
                    // split deze items
                    $items = implode(",", $itemts);
                    
                    //zoek unieke koppel ids obv de items
                        $SelectQuery = mysql_query("
                        SELECT
                                DISTINCT criterium_koppel_id
                        FROM
                                criteriumresultaat
                        WHERE
                                criteriumresultaat_koppel_id IN(".$items.")
                        AND
                                onderwerp_id = ".$onderwerp."
                        ") or die (mysql_error());
                        
                        //wat zijn de unieke items
                        while($uniqdata = mysql_fetch_assoc($SelectQuery)){

                            $uniquearray[] = $uniqdata['criterium_koppel_id'];
                        
                        }

                        $uniekekoppels = implode(",", $uniquearray);
                        $queryrow = mysql_query("SELECT criteriumresultaat_id FROM criteriumresultaat WHERE criterium_koppel_id IN (".$uniekekoppels.") AND criteriumresultaat_koppel_id IN(".$items.") ") or die (mysql_error());
                        
                        while ($data = mysql_fetch_assoc($queryrow)){
                        
                            //pak gemiddelde
                            //$queryrow = mysql_query("SELECT SUM(criteriumresultaat_percentage) FROM criteriumresultaat WHERE criterium_koppel_id IN (".$uniekekoppels.") AND criteriumresultaat_koppel_id IN(".$items.") ") or die (mysql_error());
                                echo $data['criteriumresultaat_id']. " ";
                                //$gemiddelde += $data['criteriumresultaat_percentage'];
                            // hieruit komen alle unieke id's dat is goed
                            // wat moet is dat
                                
                        }                    
                    
                
                                
Gewijzigd op 27/11/2011 18:53:51 door Gammele vraal
 
PHP hulp

PHP hulp

24/11/2024 17:55:36
 
Erwin H

Erwin H

27/11/2011 14:03:59
Quote Anchor link
In je laatste query mist er in elk geval een haakje achter "SUM(criteriumresultaat_percentage"

Verder als je een sum of count uitvoerd en dubbele records krijgt van de ids die je probeert op te tellen, dan ligt het veelal aan het ontbreken van een GROUP BY statement op de kolom die je gebruikt voor de berekening. Zet dat aan het einde van je query en kijk of het dan wel werkt.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

27/11/2011 16:43:29
Quote Anchor link
Ik zie dat je 2 queries gebruikt op 1 tabel. Dat moet denk ik makkelijker kunnen. Kan je eens wat specifieker aangeven welke waarden in welke tabel staan en hoe je het wilt uitlezen.
Gewijzigd op 27/11/2011 16:43:48 door Ger van Steenderen
 
Gammele vraal

gammele vraal

27/11/2011 19:05:06
Quote Anchor link
Scherp gezien, dat is inderdaad een fout, bedankt voor de group by tip.

@Ger:

In de tabel resultaat staat het totale resultaat opgeslagen van in ingevuld formulier met een overall opmerking over dit formulier. Het percentage in deze tabel, is het berekende percentage bij het invoeren van dit formulier, niet te verwarren met de criteriumresultaat percentages. Deze percentages zijn percentages die in het zelfde formulier zijn ingegeven, maar dan met het ingevoerde percentage per criteria.

Graag zou ik willen zien wat voor vragen goed en slecht zijn beoordeeld op een selectie van resultaat_id's. Bijvoorbeeld van een bepaalde datumreeks. Het ene moment kent andere criteria dan een ander moment, maar het kan best zijn dat criterias ook overlappen, dat ze vaker voorkomen. In dit geval zou het gemiddelde van deze criteria weergegeven moeten worden, ipv 4x een criteria met een score.

Heb je een idee hoe ik dit beter kan doen?
Gewijzigd op 28/11/2011 10:21:35 door gammele vraal
 
Gammele vraal

gammele vraal

29/11/2011 10:08:39
Quote Anchor link
Zou het misschien kunnen met AVG en group by, alleen hoe pas ik zoiets toe? Zodat wel de lijst met koppelingen wordt weergegeven?
Gewijzigd op 29/11/2011 10:09:06 door gammele vraal
 
Erwin H

Erwin H

29/11/2011 10:57:33
Quote Anchor link
Algemene antwoord: ja.
Alleen is jouw db structuur voor mij een beetje ondoorzichtelijk waardoor het lastig is om snel even een voorbeeld query in elkaar te zetten voor je.

Wat je normaal gesproken doet met een AVG, MIN, MAX, SUM of COUNT functie is dat je die in je select opneemt en dan via een GROUP BY splits je de uitkomsten. Dus als je bijvoorbeeld een tabel hebt met product_id's en verkopen per dag en je wil je gemiddelde verkoop per dag hebben dan zou je het volgende doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT product_id, AVG(verkopen) AS gemiddelde
FROM verkoop_tabel
GROUP BY product_id


De database telt dan alle verkopen van ieder product bij elkaar op en neemt het gemiddelde daarvan.
Gewijzigd op 29/11/2011 10:59:20 door Erwin H
 
Gammele vraal

gammele vraal

29/11/2011 11:10:40
Quote Anchor link
Dat lijkt me niet erg lastig, ik het zal het proberen in mijn context. Het komt wel overeen, ik heb ook verschillende scores, maar moet alleen nog een extra check doen op de criterium_koppel_id (deze bepaald een de selectie op de datum).

http://www.imagedump.nl/img20/8570/11phpmyadminscores.png
Zie de geacceerde rows, het is dus zo dat er twee verschillende criteriumresultaat_koppel_id's (van 2 resultaten) zijn, met verschillende antwoorden.

Criterium_koppel_id is de tekst die er bij hoort.
Het volgende heb ik zojuist opgezet,wat blijkt te werken, ik houd jullie op de hoogte.

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
                    $items = implode(",", $itemts);
                                        
                        $SelectQuery = mysql_query("
                        SELECT
                                DISTINCT criterium_koppel_id
                        FROM
                                criteriumresultaat
                        WHERE
                                criteriumresultaat_koppel_id IN(".$items.")
                        AND
                                onderwerp_id = '".mysql_real_escape_string($_GET['onderwerp'])."'
                        ") or die (mysql_error());
                        
                        $gefilterdearray = array();
                        
                        while($uniqdata = mysql_fetch_assoc($SelectQuery)){
                            //resultaat id's die moeten worden meegenomen
                            $gefilterdearray[] = $uniqdata['criterium_koppel_id'];
                        }
                        
                        $koppels = implode(",", $gefilterdearray);
                        $queryrow = mysql_query("
                        SELECT
                            criterium_koppel_id,
                            AVG(criteriumresultaat_percentage)
                        FROM
                            criteriumresultaat
                        WHERE
                            criteriumresultaat_koppel_id
                        IN
                            (".$items.")
                        AND
                            criterium_koppel_id
                        IN
                            (".$koppels.")
                        GROUP BY
                            criterium_koppel_id") or die (mysql_error());
    
                        while($avgdata = mysql_fetch_assoc($queryrow)){
                            
                            $select = mysql_query("SELECT criterium_tekst FROM criterium WHERE criterium_id = '".$avgdata['criterium_koppel_id']."'") or die (mysql_error());
                            $datacrit = mysql_fetch_assoc($select);
                            
                            echo $datacrit['criterium_tekst'] . " score : " . round($avgdata['AVG(criteriumresultaat_percentage)']). " <br/>";
                        }
Gewijzigd op 29/11/2011 11:35:18 door gammele vraal
 
Erwin H

Erwin H

29/11/2011 11:42:01
Quote Anchor link
Nu alleen nog de eerste query in de tweede verwerken zodat je nog maar een query nodig hebt ;-)
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

29/11/2011 11:53:11
Quote Anchor link
Volgens mij kan het ook in 1 query dmv een join en een subquery:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
SELECT t3.datum, t3.id, AVG(t3.perc)
FROM
    (SELECT t1.resultaat_datum as datum, t2.criterium_koppel_id AS id,
     t2.criteriumresultaat_percentage AS perc
    FROM resultaten AS t1
    JOIN criteriumresultaat AS t2 ON
         t1.resultaat_id = t2.criteriumresultaat_koppel_id
    WHERE t1.resultaat_datum
    BETWEEN "2011-11-22" AND "2011-11-29") AS t3
GROUP BY t3.id
 
Gammele vraal

gammele vraal

29/11/2011 13:15:48
Quote Anchor link
Bedankt Ger, alleen ik moet nog wel de juiste items ophalen.

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
28
29
                            $queryrow = mysql_query("
                            SELECT
                                t3.datum, t3.criterium_koppel_id, AVG(t3.criteriumresultaat_percentage)
                            FROM
                                (SELECT
                                    t1.resultaat_datum as datum,
                                    t2.criterium_koppel_id AS criterium_koppel_id,
                                    t2.criteriumresultaat_percentage AS criteriumresultaat_percentage
                                FROM
                                    resultaat AS t1
                                JOIN
                                    criteriumresultaat AS t2 ON
                                    t1.resultaat_id = t2.criteriumresultaat_koppel_id
                                WHERE
                                    t1.resultaat_datum
                                BETWEEN
                                    '".$vanaf."' AND '".$eind."'
                                AND
                                    criteriumresultaat_koppel_id
                                IN
                                    (".$items.")
                                AND
                                    criterium_koppel_id
                                IN
                                    (".$koppels.")                             
                                )
                            AS t3
                            GROUP BY t3.criterium_koppel_id ORDER BY AVG(t3.criteriumresultaat_percentage) ASC")
                             or die (mysql_error());
Gewijzigd op 29/11/2011 13:26:03 door gammele vraal
 



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.