Goedemorgen,

Het EK is nog niet voorbij, en ik hou me alweer bezig met het WK (je kan nooit te vroeg beginnen). Ik was bezig om een WK poule te maken, en daarvoor wou ik eerst een goed speelschema opzetten. Hiervoor heb ik een databaseontwerp gemaakt, en vraag me af of dit een goede manier is.

PK = primary key
FK = foreign key

WK DATABASE

	- Team
		- team_id (PK)
		- naam_full
		- naam_short
		- website
		
	- Spelers
		- speler_id (PK)
		- voornaam
		- achternaam
		- geboortedatum
		- team_id (FK)
	
	- Doelpunten
		- goal_id (PK)
		- wedstrijd_id (FK)
		- speler_id (FK)
		- team_id (FK)
		- minuut	
		
	- Wedstrijden
		- wedstrijd_id (PK)
		- thuis_team_id (FK)
		- uit_team_id (FK)
		- datetime
		- stadion_id (FK)
		- type_id (FK)
		- scheidsrechter_id (FK)
		
	- westrijd_type (kwalificatie, groepswedstrijd, kwartfinale enz.)
		- naam
		- type_id (PK)
	
	- Stadion
		- stadion_id (PK)
		- naam
		- plaats
		- capaciteit
		
	- Poule 
		- poule_id (PK)
		- naam	
	
	- Scheidsrechter
		- scheidsrechter_id (PK)
		- naam
	- indeling
		- indeling_id (PK)
		- poule_id (FK)
		- team_id (FK)
		- indeling_type_id (FK)
		- continent_id (FK)
	- indeling_type
		- id (PK)
		- name (UNIQUE) (kwalificatie of eindronde)

	- continenten
		- continent_id (PK)
		- name (UNIQUE)
@Ger ik krijg geen foutmelding omdat ik niet de hele sql code heb geplakt hier. En over je vraag, ik zou kunnen opvragen:

WHERE datum_van_wedstrijd + bepaald_aantal_minuten < now()


Maar omdat een wedstrijd natuurlijk ook gestaakt kan worden, of langer doorgaat dan gepland zou ik denk ik beter een veld bij matches kunnen maken met finished 0 of 1.
Moet het even uit mijn hoofd doen, maar dit is zoals ik het opgelost heb:

SELECT t.team_id, t.team_name,
	SUM(m.points) total,
	SUM(m.goals_scored) gls_for,
	SUM(m.goals_against) gls_against, COUNT(*) matchesplayed,
	SUM(m.won) matches_won, SUM(m.draw) matches_draw,
	SUM(m.lost) matches_lost
FROM teams t
LEFT JOIN
	(SELECT match_id, home_id team_id
		(CASE WHEN home_score > away_score THEN 3
		WHEN home_score = away_score THEN 1
		ELSE 0 END) points,
		IF(home_score > away_score, 1, 0) won,
		IF(home_score = away_score, 1, 0) draw,
		IF(home_score < away_score, 1, 0) lost,
		home_score goals_scored,
		away_score goals_against
	FROM matches
	WHERE home_score IS NOT NULL
	UNION
	SELECT match_id, away_id team_id
		(CASE WHEN home_score < away_score THEN 3
		WHEN home_score = away_score THEN 1
		ELSE 0 END) points,
		IF(home_score < away_score, 1, 0) won,
		IF(home_score = away_score, 1, 0) draw,
		IF(home_score > away_score, 1, 0) lost,
		away_score goals_scored, home_score goals_against
	FROM matches
	WHERE home_score IS NOT NULL)
	AS m ON t.team_id = m.team_id
GROUP BY t.team_id, t.team_name
ORDER BY total DESC, matches_played, (gls_for - gls_against) DESC, t.teamname

Lijkt mij toch een stuk eenvoudiger dan gaan lopen hannessen in PHP en dan ook een x aantal queries te veel uitvoeren.
@Ger bedankt voor dit voorbeeld, ik kende een aantal mysql functies die je hier gebruikt nog niet, maar die ga ik nu uittesten!
Welke functies kende je dan niet?
Ik heb de query trouwens wat aangepast zodat ook het aantal gewonnen, gelijke en verloren spelen bepaald worden.

Reageren