Avatar billede simonfreiesleben Nybegynder
17. juni 2009 - 15:20 Der 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.

Det kunne så således ud:

tbl_medarbejdere(id, fornavn, efternavn, adresse, postnr, email, tlf)
&
tbl_postnumre(postnr, postdistrikt)

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.

På forhånd tak.

Mvh
Simon
Avatar billede arne_v Ekspert
17. juni 2009 - 15:24 #1
SELECT tbl_medarbejdere.*, tbl_postnumre.postdistrikt
FROM tbl_medarbejdere INNER JOIN tbl_postnumre ON tbl_medarbejdere.postnr = tbl_postnumre.postnr
WHERE tbl_medarbejdere.id = 23
Avatar billede arne_v Ekspert
17. juni 2009 - 15:24 #2
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
Avatar billede arne_v Ekspert
17. juni 2009 - 15:25 #3
INNER JOIN laver det samme som din SELECT

det er LEFT JOIN som klare de manglende vaerdier i postnumre tabellen
Avatar billede simonfreiesleben Nybegynder
17. juni 2009 - 15:40 #4
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
;

Måske du kan lure hvad der galt?
Avatar billede simonfreiesleben Nybegynder
17. juni 2009 - 15:45 #5
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.

Men nu får jeg ingenting.
Avatar billede arne_v Ekspert
17. juni 2009 - 21:58 #6
Du skal bruge LEFT JOIN hvis hoejre side maa "mangle".
Avatar billede arne_v Ekspert
17. juni 2009 - 21:59 #7
Check evt. eksemplet med LEFT JOIN i http://www.eksperten.dk/guide/389
Avatar billede simonfreiesleben Nybegynder
23. juli 2009 - 18:40 #8
Tak for hjælpen.
Vil du ikke svare.
Avatar billede arne_v Ekspert
23. juli 2009 - 19:06 #9
kommer her
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester