Optellen van records
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)
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
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
}
// 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
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.
Gewijzigd op 27/11/2011 16:43:48 door Ger van Steenderen
@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
Gewijzigd op 29/11/2011 10:09:06 door gammele vraal
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:
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
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)
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
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/>";
}
$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
Nu alleen nog de eerste query in de tweede verwerken zodat je nog maar een query nodig hebt ;-)
Code (php)
1
2
3
4
5
6
7
8
9
10
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
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
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
28
29
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());
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