17. juni 2009 - 15:20Der er
8 kommentarer og 1 løsning
At joine med en anden tablen uden at vide om den har en rækker der passer
Hej alle
Jeg vil gerne lave en forespørgsel hvor jeg kan hive data ind fra en anden (joinet) tabel, hvis der er noget data der passer, men bare tomme værdier, hvis ikke der er.
Jeg vil så gerne lave en forespørgsel hvor jeg vælger alle informationer om medarbejder med id=23 samt postdistriktet der passer til hans postnummer.
JEg kunne skrive:
SELECT tbl_medarbejdere.*, tbl_postnumre.postdistrikt FROM tbl_medarbejdere, tbl_postnumre WHERE tbl_medarbejdere.id = 23 AND tbl_medarbejdere.postnr = tbl_postnumre.postnr;
Jeg vil altså gerne trække værdierne fra tbl_postnumre, hvis der er data, som passer til. Hvis ikke vil jeg bare have tomme felter.
Mit problem er at jeg ikke er sikker på at der er en række i tbl_postnumre som indeholder postnummer og postdistrikt der passer til medarbejder 23s postnummer.
Hvis ikke der findes sådan en række i tbl_postnumre, så får jeg en fejl. Hvordan undgår jeg dette, så jeg i stedet bare får tomme felter?
(Dette er et tænkt eksempel, som svarer til min egentlige problemstilling. Men det vil altså ikke hjælpe mig fx at have en tabel med alle danske postnumre...)
JEg håber der er noget der er mere velbevandret i MySQl end jeg selv.
SELECT tbl_medarbejdere.*, tbl_postnumre.postdistrikt FROM tbl_medarbejdere LEFT JOIN tbl_postnumre ON tbl_medarbejdere.postnr = tbl_postnumre.postnr WHERE tbl_medarbejdere.id = 23
Når jeg læser om det er jeg sikker på at du har ret, me jeg kan ikke få det til at virke. Men du skal da have point for dit svar. Jeg er sikker på det er rigtigt.
Måske du kan hjælpe mig videre.
Jeg er ikke særlig ferm til at forstå de joins. Hvad hedder den slags join jeg laver i min SQL statement jeg skriver ovenfor, hvor jeg bare lister taballerne jeg skal bruge kommasepereret og skriver alle join conditions i min WHERE clause?
Faktsik ser min forespørgsel således ud:
SELECT DATE(c.timestarts) AS Dato, if (c.contractnr > 0, "Confirmed", "tbc") AS Status, ag.navn as Band, if (c.constellationid > 0, cg.navn, "Fuldt band") AS Konstellation, bg.navn as Arrangør, sg.navn as Spillested, sg.adresse as Adresse, sg.postnr as `Postnr.`, sg.bynavn as `By` FROM groups as bg groups as ag, groups as sg, contract as c INNER JOIN groups AS cg ON c.constellationid = cg.id WHERE ag.id = c.artistid AND bg.id = c.buyerid AND sg.id = c.venueid AND c.timestarts > NOW() AND (c.artistid = 91) ORDER BY c.timestarts ;
Det er vist mig der kludrer i det. Nu får jeg ingen fejl:
Men jeg får 0 rows som resultat. Så der er nok ged i mine joins.
Der er en kontrak med id=93 og der er både BAnd arrangør og spillestedds grupper. Men jeg ved at der ikke er noget konstellationsgruppe, der passer til den værdi som står o contract tabellen.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.