mysqli query voor poll

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jac E

Jac E

24/04/2016 19:21: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
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       |
+-------+-------+---------+


Zo wil ik de uitkomst van de poll:
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
+------+---------------+-----------------+
| 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)
PHP script in nieuw venster Selecteer het PHP script
1
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 />";
}

?>
Gewijzigd op 25/04/2016 00:12:46 door Jac E
 
PHP hulp

PHP hulp

29/04/2024 03:01:57
 
Jan de Laet

Jan de Laet

24/04/2016 19:34:59
Quote Anchor link
Heb je ook een tabel waar de mogelijke antwoorden per poll in staan? Als je hem niet hebt is het misschien handig om te maken.
Bijvoorbeeld:
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
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        |
+------+---------------+


Dan zou deze sql kunnen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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
Gewijzigd op 24/04/2016 19:36:08 door Jan de Laet
 
Jac E

Jac E

25/04/2016 00:40:24
Quote Anchor link
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".

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
 
- Ariën  -
Beheerder

- Ariën -

25/04/2016 00:53:38
Quote Anchor link
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 -
 
Jac E

Jac E

25/04/2016 01:34:13
Quote Anchor link
Ariën, klopt. Heb de fout ontdekt... Ik krijg nu alleen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
11
12
13
21
22
23
31
32
33
34
35
36

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
Poll 1
mogelijkheid  -> percentage
1             -> 50%
2             -> 20%
3             -> 30%
 
Jan de Laet

Jan de Laet

25/04/2016 08:13:32
Quote Anchor link
@Jac E,
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.
 
Jac E

Jac E

25/04/2016 09:08:13
Quote Anchor link
Hey Jan. Ik zal je advies uiteraard volgen. Dank je voor het advies.
Hieronder het test scriptje. Heb wel andere namen voor de variabelen.
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
<?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 />";
}

?>
Gewijzigd op 25/04/2016 17:28:38 door Jac E
 
- Ariën  -
Beheerder

- Ariën -

25/04/2016 09:10:00
Quote Anchor link
Maar, welke error geeft MySQL nou precies naast je PHP-Warning?
Gewijzigd op 25/04/2016 09:12:09 door - Ariën -
 
Jac E

Jac E

25/04/2016 09:12:00
Quote Anchor link
Ik krijg geen foutmeldingen meer. Gelukkig.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

25/04/2016 09:16:02
Quote Anchor link
Misschien nog even je tabel- en kolomnamen delen met ons nu je een tabel bijgemaakt hebt?
 
Jan de Laet

Jan de Laet

25/04/2016 11:18:27
Quote Anchor link
Je zult na regel 13 ook de 3e kolom (met daarin de count) ook moeten echoën.

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
   echo $row['aantal'];


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
 
Jac E

Jac E

25/04/2016 11:27:46
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


Toevoeging op 25/04/2016 11:36:32:

De uitslag is goed nu. Pfff. Straks verder met een duidelijker opmaak... en de percentages nog.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
110
120
130
212
220
230
311
320
330
340
350
360


Toevoeging op 25/04/2016 11:46:46:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
...
360
370
381
390
3100


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
 
Jan de Laet

Jan de Laet

25/04/2016 19:18:01
Quote Anchor link
Je kan 2 dingen doen.
Deze extra query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT vraag_nummer, COUNT(antwoord_meerkeuze) AS totaal_vragen
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)
PHP script in nieuw venster Selecteer het PHP script
1
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


Elke rij zal nu behalve de totalen per vraag_mogelijkheid ook een totaal per vraag hebben. Bijv.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

(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)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
, COUNT(deelnemer_id)/t.totaal_vragen AS percentage

Evt met afronding naar 2 decimalen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
, ROUND((COUNT(deelnemer_id)/t.totaal_vragen), 2) AS percentage


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
 
Jac E

Jac E

25/04/2016 23:59:46
Quote Anchor link
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!
 
Jan de Laet

Jan de Laet

26/04/2016 13:51:37
Quote Anchor link
Graag gedaan Jac E en fijn dat je geholpen bent.
 
Thomas van den Heuvel

Thomas van den Heuvel

27/04/2016 15:38:57
Quote Anchor link
Gotcha: als er nog niet gestemd is moet je wellicht waken voor het delen door 0.

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
 



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.