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.
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.
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
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: