Database structuur poll
Ik ben bezig met een poll te schrijven. Het is de bedoeling dat er meerdere polls aanwezig kunnen zijn. Daarvoor wordt de database structuur ingewikkeld.
Zelf dacht ik al aan zoiets:
Table poll
- id
- poll_onderwerp
- datum
- poll_auteur
- poll_type ( meerkeuze/eenkeuze/janee )
- aantal_vragen
Maar dan moet ik in een andere tabel de data opslaan voor hoevaak er per antwoord is gestemd, en welke poll_antwoorden er mogelijk zijn om te kiezen. De php lukt me wel, echt heb ik geen idee hoe ik dergelijke dingen in een database opsla.
Heeft iemand wat tips?
Groet vlerk
Een poll is altijd een meerkeuze-poll, een poll met 1 antwoord is geen poll. ja/nee zijn bv. al 2 keuzes, maar je mag slechts 1 keuze maken, 1 antwoord geven. Het aantal vragen hoef je niet op te slaan, dat doe je al door de vragen in een tabel te zetten. Heb je 3 vragen, dan heb je 3 vragen. Ja toch? Zinloos om nog ergens te noteren dat het 3 vragen zijn.
Kortom, er missen in jouw opzetje nog wel een paar tabellen.
table poll
poll_id
poll_onderwerp
datum
auteur
table poll_keuze
keuze_id
poll_id
keuze
Gewijzigd op 01/01/1970 01:00:00 door Gerben G
En natuurlijk moet in de opzet van Donhertog nog de kolom 'geklikt' (of iets dergelijks) om bij te houden hoe vaak het antwoord gekozen.
Elwin schreef op 30.01.2008 14:22:
Ik zou reacties met ip-adressen in een aparte tabel opslaan, dan kun je altijd nog tellen hoevaak er is gereageerd. Tevens kun je nog veel afleiden van de reacties, dat gaat niet wanneer je alleen het aantal reacties opslaat.En natuurlijk moet in de opzet van Donhertog nog de kolom 'geklikt' (of iets dergelijks) om bij te houden hoe vaak het antwoord gekozen.
Hoe je het ook oplost... in het schema van Donhertog mis je iets voor je antwoorden.
Dat klopt. Ik heb alleen maar een opzetje gemaakt voor de poll zelf niet voor de afhandeling daarvan. Maar volgens mij zou dit een goede uitbreiding zien:
table kliks
klik_id
poll_id
keuze_id
ip
Nog even een datumtijd erbij en het feest is compleet!
poll_id
poll_onderwerp
datum
auteur
table poll_keuze
keuze_id
poll_id
keuze
table poll_kliks
klik_id
poll_id
keuze_id
ip
datumtijd
Ik denk denk ik hiermee begin.
Maar hoe breng ik dit nu in de pratijk?
Met de table polls weergeef ik op de hoofdpagina dus alle polls.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$q = mysql_query("SELECT * FROM `poll`");
while($list = mysql_fetch_array($q)) {
echo $list['poll_onderwerp']." <br />";
// nu nog de vragen echoen.
}
?>
$q = mysql_query("SELECT * FROM `poll`");
while($list = mysql_fetch_array($q)) {
echo $list['poll_onderwerp']." <br />";
// nu nog de vragen echoen.
}
?>
Nu wil ik natuurlijk de vragen erbij weergeven. Hiervoor maak ik een inwendige query en while-lus.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
$q2 = mysql_query("SELECT * FROM `poll_keuze` WHERE `poll_id` = '". $list['poll_id'] ."'");
while($lst = mysql_fetch_array($q2)) {
echo '<input type="radio" name="keuze" value='..$lst['keuze'] .'">'.$lst['keuze'].'<br />';
}
?>
$q2 = mysql_query("SELECT * FROM `poll_keuze` WHERE `poll_id` = '". $list['poll_id'] ."'");
while($lst = mysql_fetch_array($q2)) {
echo '<input type="radio" name="keuze" value='..$lst['keuze'] .'">'.$lst['keuze'].'<br />';
}
?>
Uiteraard wil ik nog weten of de gebruiker nog niet heeft gestemd. Dit controlleer door de table poll_kliks erbij te betrekken. Dan wordt de eerste code ongeveer zo:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$q = mysql_query("SELECT o.poll_onderwerp, k.ip FROM `poll` AS p LEFT JOIN `poll_kliks` AS k ");
while($list = mysql_fetch_array($q)) {
echo $list['poll_onderwerp']." <br />";
$qq = mysql_query("SELECT * FROM `poll_kliks` WHERE `poll_id` = '". $list['poll_id'] ."'");
$totaal_aantal_keuze = mysql_num_rows($qq);
echo $qq .' keer gestemd <hr />';
$q2 = mysql_query("SELECT * FROM `poll_keuze` WHERE `poll_id` = '". $list['poll_id'] ."'");
while($lst = mysql_fetch_array($q2)) {
if($list['ip'] == getIP()) {
echo '<input type="radio" name="keuze" value='..$lst['keuze'] .'">'.$lst['keuze'].'<br />';
} else {
$q3 = mysql_query("SELECT * FROM `poll_kliks` WHERE `keuze_id` = '". $lst['keuze_id'] ."'");
$aantal_keuzes = mysql_num_rows($q3);
$percentage = $totaal_aantal_keuze / $aantal_keuzes * 100;
echo $totaal_keuzes .' ( '. $percentage .'% )';
}
}
}
?>
$q = mysql_query("SELECT o.poll_onderwerp, k.ip FROM `poll` AS p LEFT JOIN `poll_kliks` AS k ");
while($list = mysql_fetch_array($q)) {
echo $list['poll_onderwerp']." <br />";
$qq = mysql_query("SELECT * FROM `poll_kliks` WHERE `poll_id` = '". $list['poll_id'] ."'");
$totaal_aantal_keuze = mysql_num_rows($qq);
echo $qq .' keer gestemd <hr />';
$q2 = mysql_query("SELECT * FROM `poll_keuze` WHERE `poll_id` = '". $list['poll_id'] ."'");
while($lst = mysql_fetch_array($q2)) {
if($list['ip'] == getIP()) {
echo '<input type="radio" name="keuze" value='..$lst['keuze'] .'">'.$lst['keuze'].'<br />';
} else {
$q3 = mysql_query("SELECT * FROM `poll_kliks` WHERE `keuze_id` = '". $lst['keuze_id'] ."'");
$aantal_keuzes = mysql_num_rows($q3);
$percentage = $totaal_aantal_keuze / $aantal_keuzes * 100;
echo $totaal_keuzes .' ( '. $percentage .'% )';
}
}
}
?>
Ha zo meteen uit gaan testen in de praktijk. Wat kan ik hier nog aan verbeteren? Ik denk dat mysql_num_rows overbodig is. Dat ik gewoon SELECT COUNT ofzoiets kan doen. Maar dit is een begin.
1 ding dat je in ieder geval kunt verbeteren: backticks uit je queries verwijderen! Dat is rotzooi van MySQL en hoort niet thuis in een SQL query...
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$sql = " SELECT pk.keuze_id, pk.keuze, p.onderwerp, p.auteur, p.datum FROM poll_keuze pk ".
" LEFT JOIN polls p ON p.poll_id = pk.poll_id " .
" WHERE pk.poll_id = ( SELECT poll_id FROM polls WHERE onderwerp = 'Dit is een pollvaag') ";
?>
$sql = " SELECT pk.keuze_id, pk.keuze, p.onderwerp, p.auteur, p.datum FROM poll_keuze pk ".
" LEFT JOIN polls p ON p.poll_id = pk.poll_id " .
" WHERE pk.poll_id = ( SELECT poll_id FROM polls WHERE onderwerp = 'Dit is een pollvaag') ";
?>
Zoiets ofzo, je kan natuurlijk in de WHERE van de subquery elke andere colum doorzoeken op een bepaalde waarde. Op auteur ofzo, maar als een auteur meer polls heeft gemaakt moet je 'WHERE poll_id =' veranderen in 'WHERE poll_id IN (...)'
Trouwens als je die JOIN gebruikt kan die subquery er ook wel uit volgens mij :)
Dan kan je direct zoeken in de WHERE p.onderwerp = 'Dit is een pollvaag'
Anyway success.....
Zelfde query, zelfde string, maar dan in 1 oogopslag te begrijpen: