Probleem antwoorden opslaan in mysql
Ik heb een probleem, ik heb een quiz gemaakt en die antwoorden wil ik nu opslaan in mysql.
Ik maak het script zo dat er altijd nieuwe quiz bij kan, zonder dat ik het weer moet programmeren.
Dus ik weet niet hoeveel vragen er zijn. In dit geval zijn het er 16.
Ik heb de antwoorden tijdelijk opgeslagen in een Session zodat aan het einde van de quiz alle antwoorden nog heb.
Code (php)
1
2
3
4
5
2
3
4
5
$for ($i=1;$i<=$aantal;$i++){
$vraag[$i] = $_SESSION['vraag'.$i];
}
mysqli_query($con,"INSERT INTO resultaat ('Vraag_1', Vraag_2, 'Vraag_3', 'etc..') VALUES ('$vraag[$i]', '$vraag[$i]', '$vraag[$i]', 'etc..' )");
$vraag[$i] = $_SESSION['vraag'.$i];
}
mysqli_query($con,"INSERT INTO resultaat ('Vraag_1', Vraag_2, 'Vraag_3', 'etc..') VALUES ('$vraag[$i]', '$vraag[$i]', '$vraag[$i]', 'etc..' )");
Maar dit werkt dus niet helemaal zoals ik wil, aangezien ik zogenaamd niet weet hoeveel vragen er zijn..
Heb al verschillende loops geprobeerd, maar kom er niet echt meer uit.
Hopelijk hebben jullie een oplossing :-)
Mvg Daniel
Toevoeging op 17/04/2014 13:15:16:
Sorry ik ben nieuw hier, ik weet niet hoe je de code anders kunt laten zien.
Gewijzigd op 17/04/2014 13:46:48 door Daniel ravenshorst
>>> Dus ik weet niet hoeveel vragen er zijn.
Dat heet database normalisatie. Ik geloof dat er op deze site ook een tutorial over is.
Het komt er op neer dat je meerdere tabellen gebruikt en deze d.m.v. een uniek id of koppeltabel koppelt aan elkaar.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
tabel_vragen
- id (foreign key,auto_increment)
---- quiz_id
| - vraag
|
| tabel_quiz
---- id (foreign key,auto_increment)
- id (foreign key,auto_increment)
---- quiz_id
| - vraag
|
| tabel_quiz
---- id (foreign key,auto_increment)
vragen.id en quiz.id hebben een relatie.
Van quiz zal er één zijn (uniek id), maar van de vragen kunnen er zoveel zijn als je wilt.
Middel een LEFT JOIN koppel je vragen.id aan quiz.id
Gewijzigd op 17/04/2014 13:21:50 door Michael -
dit is mijn Database nu:
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 vragen
Nr Vraag Notitie Antw_a Antw_b Antw_c Antw_d Antw_e type_Antw
1 Vraag1 .... a b c d e radio
2 Vraag2 .... a b c d e checkbox
3 Vraag3 .... a b c d e radio
4 Vraag4 .... a b c d e radio
5 Vraag5 .... a b c d e checkbox
6 Vraag6 .... a b c d e radio
Tabel user_id
user_id Vraag_1 Vraag_2 Vraag_3 Vraag_4 Vraag_5 Vraag_6 Vraag_7 Vraag_8 etc..
... ... ... ... ... ... ... ... ...
Nr Vraag Notitie Antw_a Antw_b Antw_c Antw_d Antw_e type_Antw
1 Vraag1 .... a b c d e radio
2 Vraag2 .... a b c d e checkbox
3 Vraag3 .... a b c d e radio
4 Vraag4 .... a b c d e radio
5 Vraag5 .... a b c d e checkbox
6 Vraag6 .... a b c d e radio
Tabel user_id
user_id Vraag_1 Vraag_2 Vraag_3 Vraag_4 Vraag_5 Vraag_6 Vraag_7 Vraag_8 etc..
... ... ... ... ... ... ... ... ...
Gewijzigd op 17/04/2014 13:53:13 door daniel ravenshorst
Het is not-done in de databasewereld om velden of tabellen te nummeren.
Tabel quizzen:
- quiz_id
- .... (wat je nog meer wilt hebben)
Tabel vragen:
- vraag_id
- quiz_id (om te koppelen aan een quiz)
- vraag
- ....
Tabel antwoorden:
- antwoord_id
- vraag_id (om te koppelen aan de vraag, quiz_id is hier niet meer nodig)
- antwoord
- volgorde (als je altijd wilt weten welk antwoord als eerste moet komen etc)
Gewijzigd op 17/04/2014 14:26:39 door Erwin H
Ik heb dus nu 3 tabellen gemaakt zoals hierboven: quizzen, vragen en antwoorden.
Alleen begrijp ik het nog niet zo goed.
Waar komen de antwoorden die ingevoerd zijn? moet ik daar ook nog een tabel voor aanmaken?
En hoe werkt dat precies met koppelen? en waar moet ik de primary key opzetten, ik neem aan quiz_id in tabel quizzen en in tabel vragen dan vraag_id?
En zou je meer uitleg kunnen geven over de volgorde die in tabel antwoorden staat.
Mvg Daniel
tabel gegeven_antwoorden:
- gebruiker_id
- vraag_id
- antwoord_id
(met een unieke key op gebruiker_id en vraag_id als elke gebruiker maar 1 keer een quiz mag maken)
Met het koppelen zet je de primary keys op de id velden (quiz_id, vraag_id, antwoord_id). Vervolgens kan je ervoor kiezen om dan ook een foreign keys aan te maken tussen de tabellen, zodat als je de quiz wilt verwijderen alle vragen en antwoorden ook direct weg zijn.
Met de volgorde bedoel ik de volgorde zoals je de antwoorden op het scherm wilt hebben staan. Omdat in de meeste databases er geen natuurlijke sortering plaats vindt, kan het zijn dat de volgorde van de antwoorden bij een vraag de ene keer anders is dan de andere keer. Als je dat in de hand wilt houden en dus een antwoord a, b, c en d wilt hebben, dan heb je een extra kolom nodig waarin je die volgorde opslaat. Bij het ophalen van de vragen en antwoorden kan je daar dan op sorteren en op die manier krijg je altijd weer de juiste volgorde op het scherm.
Gewijzigd op 24/04/2014 14:35:52 door Erwin H
Met het koppelen zet je de primary keys op de id velden (quiz_id, vraag_id, antwoord_id).
Als dan een quiz meerdere malen gemaakt kan worden door de dezelfde gebruiker, moet je vooral geen PK leggen op die drie kolommen, want dat levert ook weer een unique constraint op.
Overigens bestaat er geen strikte vorm voor een koppeltabel.
Ik begin het steeds beter te begrijpen, heb een aantal tut's gelezen en wordt me allemaal wat duidelijker.
Alleen begrijp ik de tabel gegeven_antwoorden niet helemaal.
In een quiz komen ongeveer 15 tot 20 vragen in voor, maar die moet hij toch opslaan onder dezelfde gebruiker_id, dus dezelfde gebruiker_id komt er 15 tot 20 keer in voor.
Begrijp ik dit goed?
Toevoeging op 25/04/2014 13:54:59:
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
-- Databank: `quiz`
--
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `antwoorden`
--
CREATE TABLE IF NOT EXISTS `antwoorden` (
`antwoord_id` int(11) NOT NULL,
`vraag_id` int(11) NOT NULL,
`antwoord` varchar(255) NOT NULL,
`volgorde` char(1) NOT NULL,
KEY `vraag_id` (`vraag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `quizzen`
--
CREATE TABLE IF NOT EXISTS `quizzen` (
`quiz_id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`quiz_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `resultaat`
--
CREATE TABLE IF NOT EXISTS `resultaat` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`vraag_id` int(11) NOT NULL,
`antwoord_id` int(11) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `vragen`
--
CREATE TABLE IF NOT EXISTS `vragen` (
`vraag_id` int(11) NOT NULL,
`quiz_id` int(11) NOT NULL,
`vraag` varchar(255) NOT NULL,
`bijschrift` varchar(255) DEFAULT NULL,
KEY `quiz_id` (`quiz_id`),
KEY `vraag_id` (`vraag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Beperkingen voor gedumpte tabellen
--
--
-- Beperkingen voor tabel `antwoorden`
--
ALTER TABLE `antwoorden`
ADD CONSTRAINT `vraag_id` FOREIGN KEY (`vraag_id`) REFERENCES `vragen` (`vraag_id`) ON DELETE CASCADE ON UPDATE CASCADE;
--
-- Beperkingen voor tabel `vragen`
--
ALTER TABLE `vragen`
ADD CONSTRAINT `quiz_id` FOREIGN KEY (`quiz_id`) REFERENCES `quizzen` (`quiz_id`) ON DELETE CASCADE ON UPDATE CASCADE;
--
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `antwoorden`
--
CREATE TABLE IF NOT EXISTS `antwoorden` (
`antwoord_id` int(11) NOT NULL,
`vraag_id` int(11) NOT NULL,
`antwoord` varchar(255) NOT NULL,
`volgorde` char(1) NOT NULL,
KEY `vraag_id` (`vraag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `quizzen`
--
CREATE TABLE IF NOT EXISTS `quizzen` (
`quiz_id` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`quiz_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `resultaat`
--
CREATE TABLE IF NOT EXISTS `resultaat` (
`user_id` int(11) NOT NULL AUTO_INCREMENT,
`vraag_id` int(11) NOT NULL,
`antwoord_id` int(11) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `vragen`
--
CREATE TABLE IF NOT EXISTS `vragen` (
`vraag_id` int(11) NOT NULL,
`quiz_id` int(11) NOT NULL,
`vraag` varchar(255) NOT NULL,
`bijschrift` varchar(255) DEFAULT NULL,
KEY `quiz_id` (`quiz_id`),
KEY `vraag_id` (`vraag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Beperkingen voor gedumpte tabellen
--
--
-- Beperkingen voor tabel `antwoorden`
--
ALTER TABLE `antwoorden`
ADD CONSTRAINT `vraag_id` FOREIGN KEY (`vraag_id`) REFERENCES `vragen` (`vraag_id`) ON DELETE CASCADE ON UPDATE CASCADE;
--
-- Beperkingen voor tabel `vragen`
--
ALTER TABLE `vragen`
ADD CONSTRAINT `quiz_id` FOREIGN KEY (`quiz_id`) REFERENCES `quizzen` (`quiz_id`) ON DELETE CASCADE ON UPDATE CASCADE;
Dit is mijn database nu.
Nog suggesties, of fouten die jullie zien?
- gebruiker_id
- vraag_id
- antwoord_id
Het gebruiker_id zal dus inderdaad 15 tot 20 keer (per quiz die de gebruiker gedaan heeft) voorkomen.
Maar de vraag_id is natuurlijk telkens anders.
Het uiteindelijke record zal dus telkens uniek zijn.
In de tabel vragen mis je een PK, en ik zou daarbij ook het id van het goede antwoord opslaan.
Bij antwoorden mis je ook een PK (auto_increment).
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
-- phpMyAdmin SQL Dump
-- version 3.5.2.2
-- http://www.phpmyadmin.net
--
-- Machine: 127.0.0.1
-- Genereertijd: 25 apr 2014 om 18:21
-- Serverversie: 5.5.27
-- PHP-versie: 5.4.7
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- Databank: `quiz`
--
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `antwoorden`
--
CREATE TABLE IF NOT EXISTS `antwoorden` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`vraag_id` int(11) NOT NULL,
`antwoord` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`volgorde` varchar(1) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `vraag_id` (`vraag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=8 ;
--
-- Gegevens worden uitgevoerd voor tabel `antwoorden`
--
INSERT INTO `antwoorden` (`id`, `vraag_id`, `antwoord`, `volgorde`) VALUES
(1, 1, 'rood', 'a'),
(2, 1, 'groen', 'b'),
(3, 1, 'blauw', 'c'),
(4, 2, '25 km per week', 'a'),
(5, 2, '50 km per week', 'b'),
(6, 2, '75 km per week', 'c'),
(7, 2, '100 km per week', 'd');
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `quizzen`
--
CREATE TABLE IF NOT EXISTS `quizzen` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`titel` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;
--
-- Gegevens worden uitgevoerd voor tabel `quizzen`
--
INSERT INTO `quizzen` (`id`, `titel`) VALUES
(1, 'Test Quiz');
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `resultaten`
--
CREATE TABLE IF NOT EXISTS `resultaten` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`vraag_id` int(11) NOT NULL,
`antwoord_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `vraag_id` (`vraag_id`),
KEY `user_id` (`user_id`),
KEY `antwoord_id` (`antwoord_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
--
-- Gegevens worden uitgevoerd voor tabel `resultaten`
--
INSERT INTO `resultaten` (`id`, `user_id`, `vraag_id`, `antwoord_id`) VALUES
(1, 1, 1, 1),
(2, 1, 2, 5);
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `users`
--
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`naam` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
`email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;
--
-- Gegevens worden uitgevoerd voor tabel `users`
--
INSERT INTO `users` (`id`, `naam`, `email`) VALUES
(1, 'Frank', '[email protected]');
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `vragen`
--
CREATE TABLE IF NOT EXISTS `vragen` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`quiz_id` int(11) NOT NULL,
`vraag` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`bijschrift` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `quiz_id` (`quiz_id`),
KEY `vraag_id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
--
-- Gegevens worden uitgevoerd voor tabel `vragen`
--
INSERT INTO `vragen` (`id`, `quiz_id`, `vraag`, `bijschrift`) VALUES
(1, 1, 'Welke kleur heeft de auto?', NULL),
(2, 1, 'Hoeveel kilometer rijdt de auto per week?', NULL);
--
-- Beperkingen voor gedumpte tabellen
--
--
-- Beperkingen voor tabel `antwoorden`
--
ALTER TABLE `antwoorden`
ADD CONSTRAINT `antwoorden_ibfk_1` FOREIGN KEY (`vraag_id`) REFERENCES `vragen` (`id`) ON DELETE CASCADE;
--
-- Beperkingen voor tabel `resultaten`
--
ALTER TABLE `resultaten`
ADD CONSTRAINT `resultaten_ibfk_3` FOREIGN KEY (`antwoord_id`) REFERENCES `antwoorden` (`id`) ON DELETE CASCADE,
ADD CONSTRAINT `resultaten_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
ADD CONSTRAINT `resultaten_ibfk_2` FOREIGN KEY (`vraag_id`) REFERENCES `vragen` (`id`) ON DELETE CASCADE;
--
-- Beperkingen voor tabel `vragen`
--
ALTER TABLE `vragen`
ADD CONSTRAINT `vragen_ibfk_1` FOREIGN KEY (`quiz_id`) REFERENCES `quizzen` (`id`) ON DELETE CASCADE;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
-- version 3.5.2.2
-- http://www.phpmyadmin.net
--
-- Machine: 127.0.0.1
-- Genereertijd: 25 apr 2014 om 18:21
-- Serverversie: 5.5.27
-- PHP-versie: 5.4.7
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
--
-- Databank: `quiz`
--
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `antwoorden`
--
CREATE TABLE IF NOT EXISTS `antwoorden` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`vraag_id` int(11) NOT NULL,
`antwoord` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`volgorde` varchar(1) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `vraag_id` (`vraag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=8 ;
--
-- Gegevens worden uitgevoerd voor tabel `antwoorden`
--
INSERT INTO `antwoorden` (`id`, `vraag_id`, `antwoord`, `volgorde`) VALUES
(1, 1, 'rood', 'a'),
(2, 1, 'groen', 'b'),
(3, 1, 'blauw', 'c'),
(4, 2, '25 km per week', 'a'),
(5, 2, '50 km per week', 'b'),
(6, 2, '75 km per week', 'c'),
(7, 2, '100 km per week', 'd');
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `quizzen`
--
CREATE TABLE IF NOT EXISTS `quizzen` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`titel` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;
--
-- Gegevens worden uitgevoerd voor tabel `quizzen`
--
INSERT INTO `quizzen` (`id`, `titel`) VALUES
(1, 'Test Quiz');
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `resultaten`
--
CREATE TABLE IF NOT EXISTS `resultaten` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`vraag_id` int(11) NOT NULL,
`antwoord_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `vraag_id` (`vraag_id`),
KEY `user_id` (`user_id`),
KEY `antwoord_id` (`antwoord_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
--
-- Gegevens worden uitgevoerd voor tabel `resultaten`
--
INSERT INTO `resultaten` (`id`, `user_id`, `vraag_id`, `antwoord_id`) VALUES
(1, 1, 1, 1),
(2, 1, 2, 5);
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `users`
--
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`naam` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
`email` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=2 ;
--
-- Gegevens worden uitgevoerd voor tabel `users`
--
INSERT INTO `users` (`id`, `naam`, `email`) VALUES
(1, 'Frank', '[email protected]');
-- --------------------------------------------------------
--
-- Tabelstructuur voor tabel `vragen`
--
CREATE TABLE IF NOT EXISTS `vragen` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`quiz_id` int(11) NOT NULL,
`vraag` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`bijschrift` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `quiz_id` (`quiz_id`),
KEY `vraag_id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;
--
-- Gegevens worden uitgevoerd voor tabel `vragen`
--
INSERT INTO `vragen` (`id`, `quiz_id`, `vraag`, `bijschrift`) VALUES
(1, 1, 'Welke kleur heeft de auto?', NULL),
(2, 1, 'Hoeveel kilometer rijdt de auto per week?', NULL);
--
-- Beperkingen voor gedumpte tabellen
--
--
-- Beperkingen voor tabel `antwoorden`
--
ALTER TABLE `antwoorden`
ADD CONSTRAINT `antwoorden_ibfk_1` FOREIGN KEY (`vraag_id`) REFERENCES `vragen` (`id`) ON DELETE CASCADE;
--
-- Beperkingen voor tabel `resultaten`
--
ALTER TABLE `resultaten`
ADD CONSTRAINT `resultaten_ibfk_3` FOREIGN KEY (`antwoord_id`) REFERENCES `antwoorden` (`id`) ON DELETE CASCADE,
ADD CONSTRAINT `resultaten_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
ADD CONSTRAINT `resultaten_ibfk_2` FOREIGN KEY (`vraag_id`) REFERENCES `vragen` (`id`) ON DELETE CASCADE;
--
-- Beperkingen voor tabel `vragen`
--
ALTER TABLE `vragen`
ADD CONSTRAINT `vragen_ibfk_1` FOREIGN KEY (`quiz_id`) REFERENCES `quizzen` (`id`) ON DELETE CASCADE;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
dan gelijk maar de query om de vragen voor één quiz op het scherm te krijgen:
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
select
v.vraag, v.bijschrift, a.volgorde, a.antwoord
from
vragen v
left join
antwoorden a
on
v.id=a.vraag_id
where
v.quiz_id=1
order by
v.id, a.volgorde
v.vraag, v.bijschrift, a.volgorde, a.antwoord
from
vragen v
left join
antwoorden a
on
v.id=a.vraag_id
where
v.quiz_id=1
order by
v.id, a.volgorde
en de query om de gegeven antwoorden te krijgen voor één gebruiker en één quiz:
En waarom geef je in alle tabellen de id kolommen dezelfde naam?
In resultaten is die (AI)kolom volledig overbodig.
Ik had hem zo:
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
46
47
48
49
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
46
47
48
49
CREATE TABLE quizzen (
quiz_id INT NOT NULL AUTO_INCREMENT,
quiz_naam VARCHAR(75) NOT NULL,
PRIMARY KEY (quiz_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE vragen (
vraag_id INT NOT NULL AUTO_INCREMENT,
quiz_id INT NOT NULL,
vraag VARCHAR(255) NOT NULL,
bijschrift VARCHAR(255),
goed_antwoord INT NOT NULL,
PRIMARY KEY (vraag_id),
INDEX idx_quiz (quiz_id),
CONSTRAINT fk_quiz FOREIGN KEY (quiz_id)
REFERENCES quizzen(quiz_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE antwoorden (
antwoord_id INT NOT NULL AUTO_INCREMENT,
vraag_id INT NOT NULL,
antwoord VARCHAR(255) NOT NULL,
volgorde CHAR(1) NOT NULL,
PRIMARY KEY (antwoord_id),
INDEX idx_vraag_antwoord (vraag_id),
CONSTRAINT fk_vraag_antwoord FOREIGN KEY (vraag_id)
REFERENCES vragen(vraag_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE gebruikers (
gebruiker_id INT NOT NULL AUTO_INCREMENT,
gebruiker_naam VARCHAR(75) NOT NULL,
gebruiker_email VARCHAR(150) NOT NULL,
PRIMARY KEY (gebruiker_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE resultaten (
gebruiker_id INT NOT NULL,
vraag_id INT NOT NULL,
antwoord_id INT NOT NULL,
PRIMARY KEY (gebruiker_id, vraag_id),
INDEX idx_vraag_resultaat (vraag_id),
INDEX idx_antw_resultaat (antwoord_id),
CONSTRAINT fk_vraag_resultaat FOREIGN KEY (vraag_id, antwoord_id)
REFERENCES antwoorden(vraag_id, antwoord_id),
INDEX idx_gebr_antwoord (gebruiker_id),
CONSTRAINT fk_gebr_antwoord FOREIGN KEY (gebruiker_id)
REFERENCES gebruikers(gebruiker_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
quiz_id INT NOT NULL AUTO_INCREMENT,
quiz_naam VARCHAR(75) NOT NULL,
PRIMARY KEY (quiz_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE vragen (
vraag_id INT NOT NULL AUTO_INCREMENT,
quiz_id INT NOT NULL,
vraag VARCHAR(255) NOT NULL,
bijschrift VARCHAR(255),
goed_antwoord INT NOT NULL,
PRIMARY KEY (vraag_id),
INDEX idx_quiz (quiz_id),
CONSTRAINT fk_quiz FOREIGN KEY (quiz_id)
REFERENCES quizzen(quiz_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE antwoorden (
antwoord_id INT NOT NULL AUTO_INCREMENT,
vraag_id INT NOT NULL,
antwoord VARCHAR(255) NOT NULL,
volgorde CHAR(1) NOT NULL,
PRIMARY KEY (antwoord_id),
INDEX idx_vraag_antwoord (vraag_id),
CONSTRAINT fk_vraag_antwoord FOREIGN KEY (vraag_id)
REFERENCES vragen(vraag_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE gebruikers (
gebruiker_id INT NOT NULL AUTO_INCREMENT,
gebruiker_naam VARCHAR(75) NOT NULL,
gebruiker_email VARCHAR(150) NOT NULL,
PRIMARY KEY (gebruiker_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE resultaten (
gebruiker_id INT NOT NULL,
vraag_id INT NOT NULL,
antwoord_id INT NOT NULL,
PRIMARY KEY (gebruiker_id, vraag_id),
INDEX idx_vraag_resultaat (vraag_id),
INDEX idx_antw_resultaat (antwoord_id),
CONSTRAINT fk_vraag_resultaat FOREIGN KEY (vraag_id, antwoord_id)
REFERENCES antwoorden(vraag_id, antwoord_id),
INDEX idx_gebr_antwoord (gebruiker_id),
CONSTRAINT fk_gebr_antwoord FOREIGN KEY (gebruiker_id)
REFERENCES gebruikers(gebruiker_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Gewijzigd op 25/04/2014 19:25:37 door Ger van Steenderen
Ger van Steenderen op 25/04/2014 19:17:52:
Frank, je weet dat er ook een INNER JOIN bestaat?
En waarom geef je in alle tabellen de id kolommen dezelfde naam?
In resultaten is die (AI)kolom volledig overbodig.
En waarom geef je in alle tabellen de id kolommen dezelfde naam?
In resultaten is die (AI)kolom volledig overbodig.
Hoi Ger,
Ja ik weet dat er een inner join bestaat. Maar wellicht is het soms moeilijk om een keus te maken tussen left en inner. Misschien wil je hierover nog iets kwijt? Ik weet wel dat bij een innerjoin alleen de records opgehaald worden als er in beiden tabellen een record gevonden wordt. (zeg ik het zo goed?)
Ik geef er de voorkeur aan om de primary keys gewoonweg 'id' te noemen omdat
a. doctrine dit ook doet. Ik werk veel met doctrine
b. ik dan direct weet dat het om de primary key gaat.
c. omdat het bij een resultset met meerdere id's ook geen probleem is maar dan moet je hem even een alias geven.
De auto-increament in resultaten is inderdaad overbodig dat had ik over het hoofd gezien :-)
Frank Nietbelangrijk op 25/04/2014 21:11:23:
Ja ik weet dat er een inner join bestaat. Maar wellicht is het soms moeilijk om een keus te maken tussen left en inner. Misschien wil je hierover nog iets kwijt? Ik weet wel dat bij een innerjoin alleen de records opgehaald worden als er in beiden tabellen een record gevonden wordt. (zeg ik het zo goed?)
Ja ik weet dat er een inner join bestaat. Maar wellicht is het soms moeilijk om een keus te maken tussen left en inner. Misschien wil je hierover nog iets kwijt? Ik weet wel dat bij een innerjoin alleen de records opgehaald worden als er in beiden tabellen een record gevonden wordt. (zeg ik het zo goed?)
Je zegt het goed, bij en left join kan alles wat voor de join staat worden meegenomen, dit kan een (groot) verschil maken in de totale rijen die afgelopen moeten worden.
In dit specifieke geval:
- Zonder quiz bestaat er geen vraag.
- Zonder vraag bestaat er geen antwoord
- Een antwoord wat niet bestaat kan niet gegeven worden
Een left join kan onverwachte resultaten opleveren, maar een inner join niet en die is daarbij vaak sneller.
Quote:
Ik geef er de voorkeur aan om de primary keys gewoonweg 'id' te noemen omdat
a. doctrine dit ook doet. Ik werk veel met doctrine
b. ik dan direct weet dat het om de primary key gaat.
c. omdat het bij een resultset met meerdere id's ook geen probleem is maar dan moet je hem even een alias geven.
a. doctrine dit ook doet. Ik werk veel met doctrine
b. ik dan direct weet dat het om de primary key gaat.
c. omdat het bij een resultset met meerdere id's ook geen probleem is maar dan moet je hem even een alias geven.
Is wat Docrtine doet heilig?
Ik vind het persoonlijk een slecht gebruik om indenty kolommen een zelfde naam te geven (sterker nog, als ik het voor het zeggen heb verbied ik het)
Gewijzigd op 25/04/2014 22:07:01 door Ger van Steenderen
Thanks Ger, duidelijke antwoorden. Ben wel blij dat je het niet allemaal voor t zeggen hebt :-)
Begrijp het ook steeds beter.
Ik wil iedereen bedanken voor de hulp :-)
Ik heb een aantal aanpassingen gedaan, en nog een aantal vragen..
Ik heb ten eerste in tabel vragen goed_antwoord op NULL gezet aangezien het niet altijd voorkomt dat er een goed antwoord is. maar meer een soort van enquete, en mijn vraag is als er bijvoorbeeld meerdere antwoorden mogelijk zijn, dus als checkbox ipv radio. hoe kan ik dit het beste opslaan, gewoon dubbel in de antwoorden zetten, dan zit ik namelijk dat een gebruiker_id er 2 x inkomt voor 1 vraag. gaat dit geen problemen veroorzaken?
Nu moeten we nog even naar de resultaten kijken.
In de oude situatie was er altijd één antwoord. Indien het nu allemaal checkboxen zijn dan kan het zijn dat er geen antwoord is gegeven (alle checkboxen uit), dat er één of meerdere checkboxen zijn aangevinkt.
Je kunt dan inderdaad in de tabel resultaten één record schrijven per aangevinkte checkbox. Wel moet je even in je achterhoofd onthouden dat het ook kan zijn dat een gebruiker helemaal geen checkbox selecteert en er in dat geval helemaal geen records toegevoegd (hoeven te) worden.
Gewijzigd op 09/05/2014 18:30:41 door Frank Nietbelangrijk
Een quiz en een enquete zijn verschillende entiteiten, ze hebben wel overeenkomsten maar daar houdt het mee op.
Doe je het wel met één verzameling van tabellen kan je in de resultaten tabel geen primary key hebben over vraag_id en gebruiker_id, maar moet je daar het antwoord_id bij toevoegen.