mysqli query voor poll
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
POLL 1: REACTIE mogelijkheid 1 t/m 3
POLL 2: REACTIE mogelijkheid 1 t/m 3
POLL 3: REACTIE mogelijkheid 1 t/m 6
tabel met de reacties (op naam):
+-------+-------+---------+
| NAAM | POLL | REACTIE |
+-------+-------+---------+
| Jan | 1 | 3 |
| Jan | 2 | 2 |
| Jan | 3 | 6 |
| Piet | 1 | 3 |
| Piet | 2 | 1 |
| Piet | 3 | 2 |
| Klaas | 1 | 1 |
| Klaas | 2 | 2 |
| Klaas | 3 | 6 |
+-------+-------+---------+
POLL 2: REACTIE mogelijkheid 1 t/m 3
POLL 3: REACTIE mogelijkheid 1 t/m 6
tabel met de reacties (op naam):
+-------+-------+---------+
| NAAM | POLL | REACTIE |
+-------+-------+---------+
| Jan | 1 | 3 |
| Jan | 2 | 2 |
| Jan | 3 | 6 |
| Piet | 1 | 3 |
| Piet | 2 | 1 |
| Piet | 3 | 2 |
| Klaas | 1 | 1 |
| Klaas | 2 | 2 |
| Klaas | 3 | 6 |
+-------+-------+---------+
Zo wil ik de uitkomst van de poll:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
+------+---------------+-----------------+
| POLL | MOGELIJKHEDEN | AANTAL REACTIES |
| 1 | 1 | 1 |
| | 2 | 0 |
| | 3 | 2 |
| | | |
| 2 | 1 | 1 |
| | 2 | 2 |
| | 3 | 0 |
| | | |
| 3 | 1 | 0 |
| | 2 | 1 |
| | 3 | 0 |
| | 4 | 0 |
| | 5 | 0 |
| | 6 | 2 |
+------+---------------+-----------------+
| POLL | MOGELIJKHEDEN | AANTAL REACTIES |
| 1 | 1 | 1 |
| | 2 | 0 |
| | 3 | 2 |
| | | |
| 2 | 1 | 1 |
| | 2 | 2 |
| | 3 | 0 |
| | | |
| 3 | 1 | 0 |
| | 2 | 1 |
| | 3 | 0 |
| | 4 | 0 |
| | 5 | 0 |
| | 6 | 2 |
+------+---------------+-----------------+
De vraag is dus hoe vaak een reactie (= waarde) wordt gegeven per mogelijkheid per poll.
Wie kan mij verder stuk op weg helpen? Ik heb al een begin met alleen waarde 1 als reactie mogelijkheid. Deze moet dus doorgaan t/m 6.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$query = mysqli_query($con,"SELECT poll, SUM(IF(reactie = '1', 1,0)) AS `reactie_1`, COUNT(reactie) AS `totaal` FROM tabel GROUP BY poll ORDER BY poll");
while($row = mysqli_fetch_array($query)) {
echo "In pol: ". $row['poll']. " komt de waarde 1 maar ". $row['reactie_1'] . "x voor";
echo "<br />";
}
?>
$query = mysqli_query($con,"SELECT poll, SUM(IF(reactie = '1', 1,0)) AS `reactie_1`, COUNT(reactie) AS `totaal` FROM tabel GROUP BY poll ORDER BY poll");
while($row = mysqli_fetch_array($query)) {
echo "In pol: ". $row['poll']. " komt de waarde 1 maar ". $row['reactie_1'] . "x voor";
echo "<br />";
}
?>
Gewijzigd op 25/04/2016 00:12:46 door Jac E
Bijvoorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Tabel poll_opties
+------+---------------+
| POLL | MOGELIJKHEID |
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
| 3 | 2 |
| 3 | 3 |
| 3 | 4 |
| 3 | 5 |
| 3 | 6 |
+------+---------------+
+------+---------------+
| POLL | MOGELIJKHEID |
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
| 3 | 2 |
| 3 | 3 |
| 3 | 4 |
| 3 | 5 |
| 3 | 6 |
+------+---------------+
Dan zou deze sql kunnen:
Code (php)
1
2
3
4
5
2
3
4
5
SELECT poll_opties.poll, poll_opties.mogelijkheid, COUNT(naam)
FROM poll_opties
LEFT OUTER JOIN poll ON poll.poll=poll_opties.poll and poll.reactie=poll_opties.mogelijkheid
GROUP BY poll_opties.poll, poll_opties.mogelijkheid
ORDER BY poll_opties.poll, poll_opties.mogelijkheid
FROM poll_opties
LEFT OUTER JOIN poll ON poll.poll=poll_opties.poll and poll.reactie=poll_opties.mogelijkheid
GROUP BY poll_opties.poll, poll_opties.mogelijkheid
ORDER BY poll_opties.poll, poll_opties.mogelijkheid
Gewijzigd op 24/04/2016 19:36:08 door Jan de Laet
Kan het ook zonder deze extra tabel? Ik vraag dit omdat ik al een tabel heb met hierin op naam de waarden. Genoeg info dan? Is alleen een soort loop van 1 t/m 6 misschien een oplossing (en groeperen op poll)? Dit omdat mijn werkend voorbeeld script alleen naar de reacties met waarden 1 kijkt en niet naar de rest.
Gewijzigd op 25/04/2016 00:54:19 door Jac E
Jac E op 25/04/2016 00:40:24:
Beste Jan. Bedankt voor je hulp. Ik heb tabel "poll_opties" toegevoegd. Ik krijg helaas error "Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given".
Bij zo'n foutafhandeling mist er blijkbaar foutafhandeling op je mysqli_query.
Wat zegt mysqli_error() ? Je kan de query ook even in phpMyAdmin gooien.
Gewijzigd op 25/04/2016 00:54:17 door - Ariën -
Welke variabele is nu die aangeeft hoe vaak een reactie (= waarde) wordt gegeven per mogelijkheid per poll.
Hoe kan ik eventueel percentages uitrekenen per cijfer/waarde -> per poll.
Bijvoorbeeld:
Laat de code eens zien zoals je die nu hebt, want zo te zien aan je resultaat krijg je nu alleen poll en de mogelijkheid. Dus zonder de teller.
Het kan best zijn dat er in mijn sql een foutje zat, want ik heb hem zo ingetikt en niet getest. Misschien zit het al in het gebruik van hoofdletters of niet voor de veldnamen. Zoals Ariën zegt, probeer het eens met phpMyAdmin
En ik zou zelf niet voortborduren op jouw aanpak. Kan wel maar is erg kwetsbaar voor wijzigingen.
Hieronder het test scriptje. Heb wel andere namen voor de variabelen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
$query = mysqli_query($con,"
SELECT vraag_poll, vraag_mogelijkheid, COUNT(deelnemer_id)
FROM 184_vragen_opties
LEFT OUTER JOIN 184_meerkeuze_antwoorden ON vraag_nummer=vraag_poll and antwoord_meerkeuze=vraag_mogelijkheid
GROUP BY vraag_poll, vraag_mogelijkheid
ORDER BY vraag_poll, vraag_mogelijkheid
") or die (mysqli_error($con));
while($row = mysqli_fetch_array($query)) {
echo $row['vraag_poll'];
echo $row['vraag_mogelijkheid'];
echo "<br />";
}
?>
$query = mysqli_query($con,"
SELECT vraag_poll, vraag_mogelijkheid, COUNT(deelnemer_id)
FROM 184_vragen_opties
LEFT OUTER JOIN 184_meerkeuze_antwoorden ON vraag_nummer=vraag_poll and antwoord_meerkeuze=vraag_mogelijkheid
GROUP BY vraag_poll, vraag_mogelijkheid
ORDER BY vraag_poll, vraag_mogelijkheid
") or die (mysqli_error($con));
while($row = mysqli_fetch_array($query)) {
echo $row['vraag_poll'];
echo $row['vraag_mogelijkheid'];
echo "<br />";
}
?>
Gewijzigd op 25/04/2016 17:28:38 door Jac E
Gewijzigd op 25/04/2016 09:12:09 door - Ariën -
Ik krijg geen foutmeldingen meer. Gelukkig.
Misschien nog even je tabel- en kolomnamen delen met ons nu je een tabel bijgemaakt hebt?
Misschien is het daarom beter in plaats van "COUNT(deelnemer_id)" dit te gebruiken "COUNT(deelnemer_id) AS aantal".
Dan kun je simpelweg dit toevoegen na regel 13:
En als je percentages wilt, zul je eerste het totaal moeten bepalen en $row['aantal'] moeten delen door het totaal en vermenigvuldigen met 100.
Gewijzigd op 25/04/2016 11:21:06 door Jan de Laet
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
Tabel
184_meerkeuze_antwoorden
-> antwoord_id
-> deelnemer_id
-> vraag_nummer
-> antwoord_meerkeuze
Tabel
184_vragen_opties
-> vraag_id
-> vraag_poll
-> vraag_mogelijkheid
184_meerkeuze_antwoorden
-> antwoord_id
-> deelnemer_id
-> vraag_nummer
-> antwoord_meerkeuze
Tabel
184_vragen_opties
-> vraag_id
-> vraag_poll
-> vraag_mogelijkheid
Toevoeging op 25/04/2016 11:36:32:
De uitslag is goed nu. Pfff. Straks verder met een duidelijker opmaak... en de percentages nog.
Toevoeging op 25/04/2016 11:46:46:
Alleen raar dat de waarde onderaan (3100) mij niets zegt.
Toevoeging op 25/04/2016 17:39:46:
Het werkt. Bedankt allemaal!
Alleen nog laatste vraag over die totalen voor Jan. Ik heb te maken met een array begrijp ik, hoe kan ik
een totaal berekenen per poll? Of moet er een nieuwe query komen?
Gewijzigd op 25/04/2016 17:45:12 door Jac E
Deze extra query:
Code (php)
1
2
3
4
2
3
4
SELECT vraag_nummer, COUNT(antwoord_meerkeuze) AS totaal_vragen
FROM 184_meerkeuze_antwoorden
GROUP BY vraag_nummer
ORDER BY vraag_nummer
FROM 184_meerkeuze_antwoorden
GROUP BY vraag_nummer
ORDER BY vraag_nummer
geeft je resultaat met de totalen per vraag_nummer/poll. In jouw geval dus 3 rijen. Die kun je binnen while lus gebruiken om het totaal van elke vraag op te zoeken (totaal_vragen) en per antwoord de percentages te berekenen.
Je kunt deze query ook opnemen in je originele query (zie regel 4-6), bijv:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
SELECT vraag_poll, vraag_mogelijkheid, COUNT(deelnemer_id) AS aantal, t.totaal_vragen
FROM 184_vragen_opties
LEFT OUTER JOIN 184_meerkeuze_antwoorden ON vraag_nummer=vraag_poll AND antwoord_meerkeuze=vraag_mogelijkheid
LEFT OUTER JOIN (SELECT vraag_nummer, COUNT(antwoord_meerkeuze) AS totaal_vragen
FROM 184_meerkeuze_antwoorden
GROUP BY vraag_nummer) AS t ON t.vraag_nummer=vraag_poll
GROUP BY vraag_poll, vraag_mogelijkheid
ORDER BY vraag_poll, vraag_mogelijkheid
FROM 184_vragen_opties
LEFT OUTER JOIN 184_meerkeuze_antwoorden ON vraag_nummer=vraag_poll AND antwoord_meerkeuze=vraag_mogelijkheid
LEFT OUTER JOIN (SELECT vraag_nummer, COUNT(antwoord_meerkeuze) AS totaal_vragen
FROM 184_meerkeuze_antwoorden
GROUP BY vraag_nummer) AS t ON t.vraag_nummer=vraag_poll
GROUP BY vraag_poll, vraag_mogelijkheid
ORDER BY vraag_poll, vraag_mogelijkheid
Elke rij zal nu behalve de totalen per vraag_mogelijkheid ook een totaal per vraag hebben. Bijv.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
1 1 0 0
1 2 0 0
1 3 0 0
2 1 2 2
2 2 0 2
2 3 0 2
3 1 1 1
3 2 0 1
3 3 0 1
3 4 0 1
3 5 0 1
3 6 0 1
1 2 0 0
1 3 0 0
2 1 2 2
2 2 0 2
2 3 0 2
3 1 1 1
3 2 0 1
3 3 0 1
3 4 0 1
3 5 0 1
3 6 0 1
(ik heb voor het overzicht maar een spatie tussen elke kolom gezet.)
Vraag 1 had nul antwoorden, vraag 2 2 antwoorden en vraag 3 1 antwoord.
Je kunt dan simpel de 3e kolom delen door de 4e kolom en vermenigvuldigen met 100.
Dat kun je zelfs ook nog in je query doen. Voeg dit achteraan aan je SELECT toe (op regel 1)
Evt met afronding naar 2 decimalen
Ook hier geldt weer: niet getest, uit de losse pols ingetikt.
Als je tabellen niet te groot zijn is deze oplossing waarschijnlijk het handigst.
Gewijzigd op 25/04/2016 19:22:47 door Jan de Laet
Beste Jan, super bedankt voor je tijd en hulp! Het werkt. Ik kan weer verder gelukkig. Ben blij dat je me zo goed en kundig hebt kunnen helpen. Knap werk!
Graag gedaan Jac E en fijn dat je geholpen bent.
Overigens, tenzij je een soort totaaloverzicht voor alle polls wilt creëren (voor een backend? een rapportage? iets anders?) zul je waarschijnlijk zelden tot nooit meerdere polls tegelijkertijd behandelen, maar meestal slechts één enkele poll tegelijkertijd bekijken.
En die enkele keer dat je zo'n overzicht genereert zou je wellicht gebruik kunnen maken van de reeds geschreven queries die zijn afgestemd voor "enkelvoudig" gebruik. Pas als je dit soort overzichten vaker/veelvuldig bekijkt of gebruikt kun je overwegen om aparte queries te schrijven om polls in bulk te behandelen.
Met andere woorden, misschien is het handig om eerst te kijken naar wat voor queries je nodig hebt om dingen met een enkele poll te doen, en dan pas te kijken of het dan nog nodig is om aparte queries te schrijven om meerdere polls tegelijkertijd te behandelen, of dat je, omdat je dit toch zelden of nooit doet, dan toch maar gebruik maakt van de reeds geschreven queries voor enkelvoudig gebruik. Minder efficiënt uiteraard, maar dit levert je wel tijdswinst op. Daarnaast, mocht je iets in de database-structuur wijzingen heeft dit mogelijk consequenties voor meer queries en bijbehorende code...
Gewijzigd op 27/04/2016 15:42:55 door Thomas van den Heuvel