Hulp nodig bij query

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Remco

remco

06/03/2009 14:35:00
Quote Anchor link
Beste PHP'ers

Scroll naar beneden voor het nieuwe probleem met dezelfde databaseopbouw


Ik ben mijn site wat aan het uitbreiden en om te beginnen moet ik een goed database model hebben. Ik kom zelf op het volgende uit maar misschien kijk ik wel helemaal verkeerd en vergeet ik bepaalde dingen. Zouden jullie kunnen kijken of ik zo goed zit qua database opbouw of dat jullie suggesties hebben.
Het is voor een website van 1 club. De wedstrijden zullen dus altijd door in ieder geval die club gespeeld worden.

Wedstrijden
plaats (thuis/uit)
tegenstander_id
doelpunten --> is het sneller om ze mee te geven hier of om ze te tellen vanuit de tabel met goals
doelpuntentegenstander --> zie bovenstaande
kaarten --> net als bij de goals
kaartentegenstander
soort_id
seizoen_id
datum/tijd
scheidsrechter_id
stadion_id
toeschouwersaantal

Soort wedstrijd
id
naam

Seizoen
id
jaar

scheidsrechters
id
naam
nationaliteit

Stadion
id
naam
plaats
capaciteit
foto

Goals
id
speler_id
minuut

Kaarten
id
speler_id
minuut
kleur

Spelers
id
naam
rugnr
foto
geboortedatum
geboorteplaats
nationaliteit

Clubs
id
naam
logo


Dit is waar ik op uit kwam. Met name in de tabel wedstrijden zit ik nog met wat dingetjes. Ik wil namelijk niet registreren wie een kaart heeft gekregen bij de tegenstander omdat dit niet relevant is voor mijn site. Hetzelfde met de goals van de tegenstander.

Mijn vraag is dus (voor zover nog niet duidelijk) of jullie ook tips/opmerkingen hebben voor de databaseopbouw.

Alvast bedankt voor het kijken.
Gewijzigd op 01/01/1970 01:00:00 door Remco
 
PHP hulp

PHP hulp

27/11/2024 21:22:39
 
TJVB tvb

TJVB tvb

06/03/2009 14:51:00
Quote Anchor link
remco schreef op 06.03.2009 14:35:
Beste PHP'ers
Wedstrijden
plaats (thuis/uit)
tegenstander_id
doelpunten --> is het sneller om ze mee te geven hier of om ze te tellen vanuit de tabel met goals <--direct vanuit de andere tabel doen
doelpuntentegenstander --> zie bovenstaande
kaarten --> net als bij de goals
kaartentegenstander
soort_id
seizoen_id
datum/tijd
scheidsrechter_id
stadion_id
toeschouwersaantal

Soort wedstrijd
id
naam

Seizoen
id
jaar

scheidsrechters
id
naam
nationaliteit

Stadion
id
naam
plaats
capaciteit
foto

Goals
id
speler_id
minuut
wedstrijd_id

Kaarten
id
speler_id
minuut
kleur

Spelers
id
naam
rugnr
foto
geboortedatum
geboorteplaats
nationaliteit
club

Clubs
id
naam
logo

Ik zou ook gewoon de spelers van de tegenpartij bijhouden, of desnoods een aparte speler genaamd tegenstander maken, maar dat is niet echt geweldig
doorgestreept=niet doen
onderstreept=toevoegen
Gewijzigd op 01/01/1970 01:00:00 door TJVB tvb
 
Joren de Wit

Joren de Wit

06/03/2009 14:52:00
Quote Anchor link
Enkele dingen die nog niet kloppen:

- Kolommen uit wedstrijden tabel waar jij nu over twijfelt mag je er gewoon uithalen. Dat zijn berekende aantallen en die volgen uit de gegevens uit andere tabellen.

- In de goals en kaarten tabellen mis ik een koppeling naar de wedstrijden tabel. Een FK naar het wedstrijd_id is hier wel nodig om te bepalen in welke wedstrijd de goals gevallen of kaarten gegeven zijn.

- In de spelers tabel mis ik de koppeling naar de clubs tabel. Een FK naar het club_id is nodig om vast te leggen van welke club een speler is. Eventueel zou je dit ook via een koppeltabel (inclusief begin en einddatum van contract) kunnen doen om zo een historie van een bepaalde speler bij te houden.

Let er verder op dat je voor alle kolommen de juiste datatypen gebruikt. Wellicht dat je dat al doet, maar ik zie het maar wat vaak fout gaan.
 
Frank -

Frank -

06/03/2009 15:03:00
Quote Anchor link
En wie speelt nu tegen wie? Er is alleen een tegenstander, wie de andere partij is, is een groot raadsel.

id_thuisploeg
id_uitploeg

Zo weet je direct wie tegen wie speelt en wie er thuis speelt en wie er uit speelt. De plaats lijkt mij aan een stadion gebonden, een stadion ligt niet in plaats X en de wedstrijd wordt in plaats Y gespeeld. Foutje?
 
Remco

remco

06/03/2009 15:36:00
Quote Anchor link
@pgFrank

Wie tegen wie speelt is wel duidelijk. Ik houd namelijk alleen de wedstrijden van Heerenveen bij. Aangezien ik door het aangeven van (plaats(thuis/uit)) weet wie er thuis of uit speelt is het wel duidelijk wie tegen wie speelt.
Quote:
Zo weet je direct wie tegen wie speelt en wie er thuis speelt en wie er uit speelt. De plaats lijkt mij aan een stadion gebonden, een stadion ligt niet in plaats X en de wedstrijd wordt in plaats Y gespeeld. Foutje?

Als ik het goed begrijp bedoel je de bovenste plaats? Daar geef ik alleen aan of het thuis of uit is omdat 1 club altijd hetzelfde is.
Een uit of thuiswedstrijd kan in bijv de bekerfinale in een neutraal stadion worden gespeeld dus uit of thuis bepaalt nog niet direct de plaats van de wedstrijd.

@Blance & TJVB
Ik zie nu ook dat ik bij de goals de rij met wedstrijd_id ben vergeten wat ik overigens ook ben vergeten bij kaarten (zie ik nu)
In mijn model hoeft volgens mij geen club bij de spelers omdat de spelers in mijn tabel maar van 1 club kunnen zijn (ik houd namelijk alleen de spelers van 1 club bij)
Ik denk dat ik, ondanks dat het niet erg netjes is, misschien dan toch een record moet maken met spelernaam tegenstander omdat het niet te doen is om alle spelers van alle tegenstanders toe te voegen.
Als ik een dus een speler genaamd tegenstander toevoeg kan ik inderdaad de 4 rijen laten vervallen.

Verder nog dingen of klopt het verder zo wel ongeveer
 
Frank -

Frank -

06/03/2009 15:48:00
Quote Anchor link
Quote:
Wie tegen wie speelt is wel duidelijk. Ik houd namelijk alleen de wedstrijden van Heerenveen bij.
Tot het moment dat je dit verandert... En dat moment zal niet lang op zich laten wachten, meestal gebeurt zoiets al voordat je helemaal klaar bent met je systeem. Een vriend, broer, zus of iemand anders vraagt of je de wedstrijden van club X wilt bijhouden en je bent de klos. Dit is nu nog heel erg simpel in te bouwen, dat is het straks niet meer. Doe jezelf een plezier en voer dat ene extra veldje even in. Meer is het niet.

En wanneer je gaat normaliseren, ga dan goed en volledig normaliseren en gooi niet halverwege het bijltje erbij neer omdat je denkt dat het toch nooit meer verandert. Daar zou je nog flinke spijt van kunnen krijgen.
 
Remco

remco

06/03/2009 16:13:00
Quote Anchor link
Oké dan maak ik het dus toch nog weer iets anders.
Wedstrijden
thuisclub_id
uitclub_id
soort_id
seizoen_id
datum/tijd
scheidsrechter_id
stadion_id
toeschouwersaantal

Soort wedstrijd
id
naam

Seizoen
id
jaar

scheidsrechters
id
naam
nationaliteit

Stadion
id
naam
plaats
capaciteit
foto

Goals
id
speler_id
minuut
wedstrijd_id

Kaarten
id
speler_id
minuut
kleur

Spelers
id
naam
rugnr
foto
geboortedatum
geboorteplaats
nationaliteit
club

Clubs
id
naam
logo

Klopt het zo al beter? Als ik 1 keer de juiste tabellen heb ga ik kijken naar de eigenschappen van de kolommen (INT, BIGINT etc...)
 
Joren de Wit

Joren de Wit

06/03/2009 17:48:00
Quote Anchor link
Kaarten mist nog het id van de speler. Verder kom je nu nog in de problemen als je meerdere teams van 1 club in je competitie hebt. Ik weet niet of het voorkomt, maar eigenlijk hoor je nog een tabel met teams en de bijbehorende koppelingen op te nemen.
 
Remco

remco

06/03/2009 17:58:00
Quote Anchor link
Het zal niet voorkomen dat meerdere teams van 1 club in de competitie zitten. Alles is bedoeld voor maar een club en eigenlijk ook direct 1 team. Het enige wat voor zou kunnen komen is een beker ontmoeting tussen Heerenveen en jong Heerenveen maar dat zijn al 2 verschillende club namen. De kans dat dit overigens gebeurt is heel heel heel erg klein.
 
Joren de Wit

Joren de Wit

06/03/2009 18:54:00
Quote Anchor link
Maar dan kom je weer terug bij het punt dat Frank al eerder maakte, die kans bestaat wél ook al is die nog zo klein. Nu is het een kleine moeite om die aanpassing te maken, terwijl het later veel meer moeite kost of het zelfs onmogelijk wordt.

Als je er 100% zeker van bent dat het nooit gebeurt (stel dat je een applicatie voor bijvoorbeeld de eredivisie zou maken), dan kun je je zo'n opzet veroorloven. Maar in alle andere gevallen zul je er toch zeker rekening mee houden dat je je applicatie anders wilt gebruiken dan dat je nu voor ogen hebt...
 
Remco

remco

09/03/2009 15:04:00
Quote Anchor link
Zo ik heb de bovenstaande database opbouw gebruikt en de tabellen aangemaakt met de datatypes. Zouden jullie willen controleren of de FOREIGN KEYS en datatypen zo correct zijn?

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
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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'clubs'
--

CREATE TABLE clubs (
  id int(9) unsigned NOT NULL auto_increment,
  naam varchar(40) NOT NULL,
  logo varchar(50) NOT NULL,
  PRIMARY KEY  (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'goals'
--

CREATE TABLE goals (
  id int(9) unsigned NOT NULL auto_increment,
  speler_id int(9) unsigned NOT NULL,
  wedstr_id int(9) unsigned NOT NULL,
  minuut int(3) unsigned NOT NULL,
  PRIMARY KEY  (id),
  KEY speler (speler_id),
  KEY wedstrijd (wedstr_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'kaarten'
--

CREATE TABLE kaarten (
  id int(9) unsigned NOT NULL auto_increment,
  speler_id int(9) unsigned NOT NULL,
  wedstr_id int(9) unsigned NOT NULL,
  kleur_id int(1) unsigned NOT NULL,
  minuut int(3) unsigned NOT NULL,
  PRIMARY KEY  (id),
  KEY speler (speler_id),
  KEY wedstrijd (wedstr_id),
  KEY kleur (kleur_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'nationaliteit'
--

CREATE TABLE nationaliteit (
  id int(4) unsigned NOT NULL auto_increment,
  nationaliteit varchar(40) NOT NULL,
  PRIMARY KEY  (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'scheidsrechters'
--

CREATE TABLE scheidsrechters (
  id int(4) unsigned NOT NULL auto_increment,
  naam varchar(60) NOT NULL,
  nationaliteit_id int(4) unsigned NOT NULL,
  PRIMARY KEY  (id),
  KEY nationaliteit (nationaliteit_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'seizoen'
--

CREATE TABLE seizoen (
  id int(4) unsigned NOT NULL auto_increment,
  jaar char(9) NOT NULL,
  PRIMARY KEY  (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'selectie'
--

CREATE TABLE selectie (
  id int(9) unsigned NOT NULL auto_increment,
  seizoen_id int(4) unsigned NOT NULL,
  speler_id int(9) unsigned NOT NULL,
  PRIMARY KEY  (id),
  KEY seizoen (seizoen_id),
  KEY speler (speler_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'soort_kaart'
--

CREATE TABLE soort_kaart (
  id int(1) unsigned NOT NULL auto_increment,
  kleur varchar(10) NOT NULL,
  PRIMARY KEY  (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'soort_wedstr'
--

CREATE TABLE soort_wedstr (
  id int(2) unsigned NOT NULL auto_increment,
  naam varchar(30) NOT NULL,
  PRIMARY KEY  (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'spelers'
--

CREATE TABLE spelers (
  id int(9) unsigned NOT NULL auto_increment,
  naam varchar(60) NOT NULL,
  rugnummer int(2) unsigned NOT NULL,
  foto varchar(60) NOT NULL,
  geb_datum date NOT NULL,
  geb_plaats varchar(50) NOT NULL,
  nationaliteit_id int(4) unsigned NOT NULL,
  PRIMARY KEY  (id),
  KEY nationaliteit (nationaliteit_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'stadion'
--

CREATE TABLE stadion (
  id int(4) unsigned NOT NULL auto_increment,
  naam varchar(40) NOT NULL,
  plaats varchar(40) NOT NULL,
  capaciteit int(5) unsigned NOT NULL,
  foto varchar(50) NOT NULL,
  PRIMARY KEY  (id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- Tabel structuur voor tabel 'wedstrijden'
--

CREATE TABLE wedstrijden (
  id int(9) unsigned NOT NULL auto_increment,
  thuis_id int(4) unsigned NOT NULL,
  uit_id int(4) unsigned NOT NULL,
  datum datetime NOT NULL,
  seizoen_id int(4) unsigned NOT NULL,
  soort_id int(2) unsigned NOT NULL,
  scheids_id int(4) unsigned NOT NULL,
  stadion_id int(4) unsigned NOT NULL,
  toeschouwers int(5) unsigned NOT NULL,
  PRIMARY KEY  (id),
  KEY thuis (thuis_id),
  KEY uit (uit_id),
  KEY seizoen (seizoen_id),
  KEY soort (soort_id),
  KEY scheidsrechter (scheids_id),
  KEY stadion (stadion_id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

--
-- Beperkingen voor gedumpte tabellen
--

--
-- Beperkingen voor tabel `goals`
--
ALTER TABLE `goals`
  ADD CONSTRAINT goals_ibfk_2 FOREIGN KEY (wedstr_id) REFERENCES wedstrijden (id) ON UPDATE CASCADE,
  ADD CONSTRAINT goals_ibfk_1 FOREIGN KEY (speler_id) REFERENCES spelers (id) ON UPDATE CASCADE;

--
-- Beperkingen voor tabel `kaarten`
--
ALTER TABLE `kaarten`
  ADD CONSTRAINT kaarten_ibfk_3 FOREIGN KEY (kleur_id) REFERENCES soort_kaart (id) ON UPDATE CASCADE,
  ADD CONSTRAINT kaarten_ibfk_1 FOREIGN KEY (speler_id) REFERENCES spelers (id) ON UPDATE CASCADE,
  ADD CONSTRAINT kaarten_ibfk_2 FOREIGN KEY (wedstr_id) REFERENCES wedstrijden (id) ON UPDATE CASCADE;

--
-- Beperkingen voor tabel `scheidsrechters`
--
ALTER TABLE `scheidsrechters`
  ADD CONSTRAINT scheidsrechters_ibfk_1 FOREIGN KEY (nationaliteit_id) REFERENCES nationaliteit (id) ON UPDATE CASCADE;

--
-- Beperkingen voor tabel `selectie`
--
ALTER TABLE `selectie`
  ADD CONSTRAINT selectie_ibfk_2 FOREIGN KEY (speler_id) REFERENCES spelers (id) ON UPDATE CASCADE,
  ADD CONSTRAINT selectie_ibfk_1 FOREIGN KEY (seizoen_id) REFERENCES seizoen (id) ON UPDATE CASCADE;

--
-- Beperkingen voor tabel `spelers`
--
ALTER TABLE `spelers`
  ADD CONSTRAINT spelers_ibfk_1 FOREIGN KEY (nationaliteit_id) REFERENCES nationaliteit (id) ON UPDATE CASCADE;

--
-- Beperkingen voor tabel `wedstrijden`
--
ALTER TABLE `wedstrijden`
  ADD CONSTRAINT wedstrijden_ibfk_6 FOREIGN KEY (stadion_id) REFERENCES stadion (id) ON UPDATE CASCADE,
  ADD CONSTRAINT wedstrijden_ibfk_1 FOREIGN KEY (thuis_id) REFERENCES clubs (id) ON UPDATE CASCADE,
  ADD CONSTRAINT wedstrijden_ibfk_2 FOREIGN KEY (uit_id) REFERENCES clubs (id) ON UPDATE CASCADE,
  ADD CONSTRAINT wedstrijden_ibfk_3 FOREIGN KEY (seizoen_id) REFERENCES seizoen (id) ON UPDATE CASCADE,
  ADD CONSTRAINT wedstrijden_ibfk_4 FOREIGN KEY (soort_id) REFERENCES soort_wedstr (id) ON UPDATE CASCADE,
  ADD CONSTRAINT wedstrijden_ibfk_5 FOREIGN KEY (scheids_id) REFERENCES scheidsrechters (id) ON UPDATE CASCADE;
 
Remco

remco

10/03/2009 15:32:00
Quote Anchor link
**BUMP**
p.s. Sorry voor de grote hoeveelheid maar zou toch graag willen weten of ik zo goed zit te denken omdat het toch wel een belangrijke stap is in de website.
 
Remco

remco

20/04/2009 14:31:00
Quote Anchor link
Beste,

Ik ben dus met de bovenstaande database aan de gang gegaan. Nu probeer ik echter de wedstrijden te selecteren. Het probleem is echter dat het met nog niet lukt om alles in 1 query te regelen. Wat ik wil hebben is het volgende: (te vinden in het select stuk)
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
19
20
21
22
23
24
SELECT     we.id,
    th.naam AS thuis,
    ui.naam AS uit,
    we.datum,
    ws.naam AS soort,
          se.jaar AS seizoen,
    sc.naam AS scheids,
    st.naam AS stadion,
    COUNT(dt.id) AS dthuis,
    COUNT(du.id) AS duit
FROM
    wedstrijden AS we
INNER JOIN clubs AS th ON we.thuis_id = th.id
INNER JOIN clubs AS ui ON we.uit_id = ui.id
INNER JOIN soort_wedstr AS ws ON we.soort_id = ws.id
INNER JOIN seizoen AS se ON we.seizoen_id = se.id
INNER JOIN scheidsrechters AS sc ON we.scheids_id = sc.id
INNER JOIN stadion AS st ON we.stadion_id = st.id
LEFT JOIN goals AS dt ON we.id = dt.wedstr_id
RIGHT JOIN goals AS du ON we.id = du.wedstr_id
WHERE dt.speler_id != 2
AND du.speler_id = 2
GROUP BY we.id
ORDER BY we.datum ASC


Daarbij heb ik de bovenstaande query gebruikt. Het gaat goed totdat ik de uitslag wil bepalen. Voor de duidelijkheid du.speler_id = 2 houd in dat speler_id 2 voor een uit doelpunt staat. Laat ik de doelpunten weg dan krijg ik het gewenste resultaat maar bij deze query retourneert hij niets.
Weten jullie waar dit aan kan liggen?

Alvast bedankt voor de moeite
Gewijzigd op 01/01/1970 01:00:00 door remco
 
Kitty N

kitty N

20/04/2009 16:40:00
Quote Anchor link
Je hebt 2x een WHERE in je query zitten, gebruik hier een OR of AND
 
Remco

remco

20/04/2009 16:55:00
Quote Anchor link
oeps vergeten te wijzigen ;) Heb een oudere versie van de query hierboven neergezet... dat gaf inderdaad eerst ook een error maar is nu goed (zal hem weer even wijzigen hierboven
 



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.