[SQL] Optionele conditionering

Pagina: 1
Acties:

  • Knakker
  • Registratie: April 2000
  • Laatst online: 31-07 17:39
Ik ben bezig met een website voor mijn studentennisvereniging (TAM in Groningen) en ik loop tegen een klein probleempje aan. Ik weet niet precies hoe ik het kort uit moet leggen, dus ik ga maar uitleggen hoe het zit.

Mijn database-structuur is als volgt (alleen relevante items):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
leden
  ID
  Roepnaam (VARCHAR)
  Naam (VARCHAR)
competitieteams
  ID (INT)
  Dag (TINYINT)
  Team (VARCHAR)
  Teamnaam (VARCHAR)
competitieindeling
  ID (INT)
  TeamID (INT)
  LidID (INT)
  Captain (SET: 'ja', 'nee')


Bij het opvragen van een lijstje met alle competitieteams, moeten er 4 dingen getoond worden: Team (bijv TAM Heren 1), Teamnaam (gewoon een naam die de spelers zelf bedenken voor hun team), de dag waarop het team speelt en wie de captain is van het team.

Op het moment dat de database netjes ingevuld is is mijn query:
code:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT 
  T.ID, T.Dag, T.Team, T.Teamnaam, 
  L.Naam, L.Roepnaam 
FROM 
  competitieteams AS T, 
  competitieindeling AS I, 
  leden AS L 
WHERE 
  T.ID = I.TeamID AND
  I.LidID = L.ID AND
  I.Captain = 'ja'
ORDER BY T.Dag, T.Team


Dit werkt prima. Naam van de captain wordt getoond met de combinatie Roepnaam + Naam. Voorbeeldje:

Afbeeldingslocatie: http://members.home.nl/tbouwstraat/jeroen/competitie.jpg

Het probleem ontstaat wanneer er een nieuw team wordt toegevoegd. Op dat moment zijn er nog geen leden ingedeeld in het team en is dus ook nog geen teamcaptain. Het gevolg is dat het team niet in het lijstje met alle teams komt te staan (immers bij de indeling moet iemand staan die captain is). En aangezien het indelen van de leden gebeurt in het competitieteam-subscherm valt er dus ook weinig in te delen en kun je ook moeilijk een teamcaptain aanwijzen.

Ik zou het gedeelte waarin de naam van de team captain wordt geselecteerd kunnen verwijderen uit de query en bij elk team een query uit kunnen voeren óf er een team captain is. Dit wil ik echter vermijden, en het bovenstaande in één query stoppen. Er dus voor zorgen dat het opzoeken van de naam van de teamcaptain min of meer optioneel is.

Is dit mogelijk?

[ Voor 6% gewijzigd door Knakker op 12-01-2003 17:57 ]

Geef mij maar een Warsteiner.


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Je zoekt naar een zgn. 'outer join'

Who is John Galt?


  • Knakker
  • Registratie: April 2000
  • Laatst online: 31-07 17:39
Er staat wel netjes in de MySQL documentatie hoe zo'n OUTER JOIN query in elkaar gezet moet worden, maar niet wat het nou doet. Wat doet outer join?

Geef mij maar een Warsteiner.


  • Gert
  • Registratie: Juni 1999
  • Laatst online: 05-12-2025
code:
1
2
3
SELECT b.merk f.naam
FROM bel b 
LEFT JOIN fiets f ON b.id = f.belid


Dit selecteert alle bellen in de database en plakt er een fietsnaam bij als die bel een relatie heeft met een fiets. Bellen zonder relatie worden ook getoond. Bij een INNER JOIN zouden alleen de bellen met fiets geselecteerd worden. :)

  • momania
  • Registratie: Mei 2000
  • Laatst online: 07:38

momania

iPhone 30! Bam!

Dus wat jij moet hebben in je query is een LEFT JOIN van je leden op je teams.
Hoe die query dan wordt mag je zelf uitpuzzelen ;)

Neem je whisky mee, is het te weinig... *zucht*


  • Knakker
  • Registratie: April 2000
  • Laatst online: 31-07 17:39
De query werkt, maar ik loop tegen een ander probleem aan. Ik heb nu dit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT 
  T.ID, T.KNLTBnr, T.Team, T.Teamnaam, T.Dag, 
  L.Roepnaam, L.Naam 
FROM 
  competitieteams AS T, 
  competitieindeling AS I 
LEFT JOIN 
  leden AS L 
ON 
  I.LidID = L.ID AND 
  T.ID = I.TeamID AND 
  I.Captain = 'ja' 
ORDER BY T.Dag, T.Teamnaam";

Stel dat er in totaal 10 mensen zijn ingedeeld (test fase :)), dan komt ieder team 10x voor in de lijst. Voeg ik nu een GROUP BY I.TeamID toe aan de query, dan wordt dat wel netjes 1x per team, maar dan verdwijnen dus de teams waar nog geen mensen in zijn ingedeeld. Wat doe ik fout?

Geef mij maar een Warsteiner.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Dan moet je ook dat dmv je left-join er aan vast knopen, elke tabel die potentieel niks bevat kan je er zo toch aan vast knopen.
dus iets als:
select .. from teams left join indeling on ... left join leden on ...
order by ...

[ Voor 19% gewijzigd door ACM op 15-01-2003 02:57 ]


  • Knakker
  • Registratie: April 2000
  • Laatst online: 31-07 17:39
Geniaal, harstikke bedankt! :)

Geef mij maar een Warsteiner.

Pagina: 1