Ik heb een wedstrijdprogramma voor 2 teams de wedstrijden selecteer ik met de volgende sql query

<?php

include("connect.php");

$sql= 'SELECT * FROM programmau18
UNION SELECT * FROM programmaheren
ORDER BY datum asc';

$res= mysql_query($sql) or die ("FOUT:" . mysql_error());

?>

Nu heb echo ik alle gegvens in divjes die uitgelijnt zijn naast elkaar.

Team A staat links en Team B staat rechts.

Nu pakt hij elke keer de hele container div en print die voor Team A helemaal met een lege rechter kolom.

en daaronder gooit hij de gegevens van Team B met een nieuwe container. terwijl dit eigenlijk naast Team A kolom moest staan.

Voorbeeld: http://www.pekelsharks.nl/wedstrijdprogramma.php
Ik heb goed nieuws en slecht nieuws.

Het goede nieuws is dat de query precies doet wat 'ie hoort te doen.
Het slechte nieuws is dat je datamodel onbruikbaar is.

Het probleem is dat je voor elk team apart een tabel maakt. Op het moment dat je die tabellen gaat samenvoegen met een UNION weet je dus niet meer welk record bij welk team hoort.

Eigenlijk moet je alle data die in programmau18 en programmaheren staat samenvoegen in 1 tabel 'programma' (zelf zou ik hem denk ik liever 'wedstrijden' noemen. Je moet dan alleen een veld 'teamid' toevoegen (of wellicht mooier: twee velden 'thuisteamid' en 'uitteamid' of zo).

Daarnaast maak je een tabel 'teams' aan met daarin velden 'id' (dat overeenkomt met het teamid in de programmatabel) en 'teamnaam' en eventueel nog wat meer gegevens. Hier zou je ook de teams van de tegenstanders in kunnen opnemen, zodat je later je database nog kunt uitbreiden met uitslagen enzo.

Als je daarna een 'select * from programma' uitvoert in je code, krijg je in de resultaten ook een teamid mee, waarmee je kunt bepalen of de gegevens 'links' of 'rechts' moeten staan.
Ik heb alleen maar goed nieuws: onbruikbaar is niet de juiste definitie.
Alternatief 1:

SELECT *, 'A' team_id FROM programmau18
UNION
SELECT *, 'B' FROM programmaheren
ORDER BY team_id, datum

Alternatief 2 (een FULL JOIN simulatie):

SELECT * FROM programmau18 u
LEFT JOIN programmaheren h
ON u.id = h.heren_id
UNION
SELECT * FROM programmau18 u
RIGHT JOIN programmaheren h
ON u.id = h.heren_id

In beide gevallen de * vervangen door een lijst met kolommen.
Ik was al begonnen met het opnieuw maken van mijn tabellen.

Ik heb nu een tabel genaamd 'teams' met de velden:

id
teamid
teamnaam

en een tabel genaamd 'wedstrijden' met:

id
teamid
datum
thuis
uit
speeltijd
vertrek
sporthal
adres
postcode
telefoon
sheet
scorebord
scheidsrechter1
scheidsrechter2
vervoer
reserve

Alleen is het me niet helemaal duidelijk hoe ik nu onderscheid maak tussen de 2 teams.

in tabel teams heb ik nu dus het volgende staan

id=1
teamid=1
teamnaam=Pekel Sharks U18 1

id=2
teamid=2
teamnaam=Pekel Sharks Heren 1

en in de tabel wedstrijden geef ik dus nu aan bij de heren wedstrijden een teamid van 2 en bij de u18 wedstrijden een teamid van 1.

alleen nu moet ik dus kijken hoe ik mijn sql query het laat selecteren dat hij kijkt naar de datum, vervolgens kijkt of zowel u18 als heren op die datum een wedstrijd hebben en dat print. maar hij moet ook printen als u18 geen wedstrijd heeft op een datum en heren wel. alleen dan geeft hij bij u18 aan geen wedstrijd en bij heren print hij de wedstrijd gegevens.
Op die fiets:

SELECT
	d.datum,
	COALESCE(u.thuis, 'vrij') u_thuis,
	u.uit u_uit,
	COALESCE(h.thuis, 'vrij') h_thuis,
	h.uit h_uit
FROM (SELECT DISTINCT datum FROM wedstrijden) d
LEFT JOIN wedstrijden u
	ON d.datum = u.datum AND u.teamid=1
LEFT JOIN wedstrijden h
	ON d.datum = h.datum AND h.teamid=2

Ik kom er niet uit, het schijnt dat ik COALESCE niet eens mag gebruiken van dreamweaver. en krijg ook een foutmelding Parse error: syntax error, unexpected T_STRING
Dat is helemaal niet lastig ;-)
In de subquery:

(SELECT DISTINCT datum FROM wedstrijden) d

worden alle speeldata uit de wedstrijden gehaald.
Daarna wordt met left join gekeken of team 1 op die datum speelt, en daarna met volgende left join of team 2 op die datum speelt.
Een left join heeft als gevolg dat alle datums worden meegenomen maar als niet aan de join voorwaarden voldaan wordt blijven de kolommen uit de 'andere' tabel leeg.
COALESCE geeft de eerste niet NULL expressie door in het rijtje.

Een andere - meer flexibelere - wijze:

SELECT
	td.datum,
	td.team_id
	COALESCE(w.thuis, 'vrij') thuis,
w.uit
FROM (SELECT DISTINCT d.datum, t.teamid FROM wedstrijden d, teams t
	WHERE d.datum >= CURRENT_DATE) td
/* dit koppelt alle teams aan alle te spelen datums
   kan ook als ... FROM wedstrijden d CROSS JOIN teams t */
LEFT JOIN wedstrijden w
	ON td.datum = w.datum AND td.teamid = w.team_id
/* korter USING(datum,teamid) */
ORDER BY td.datum, td.teamid

Hiermee krijg je het resultaat in rij vorm maar per datum altijd even veel rijen, maar ben je flexibel in het aantal teams.

Overigens zijn de letters achter de tabelnamen aliassen:
Met afval erbij:

LEFT JOIN wedstrijden AS w


Maar.. ik zie uit en thuis als kolommen. waarom sla je daar niet de id's van de teams in op?
@Frank
zou ik dan niet alle teams uit de competitie moeten toevoegen ?

want het gaat om 2 teams van eigen vereniging.

als ik ook andere teams een id moet geven moet ik daar ook weer onderscheid in maken toch ?

Reageren