Avatar billede machholdt Nybegynder
05. februar 2012 - 20:41 Der er 9 kommentarer og
1 løsning

Problem med join forbindelse i SQL forespørgsel

Hej

Jeg har et problem med nedenstående SQL sætning, meningen er at jeg skal trække systems.name, log.action, log.time, log.dependencyBool, log.initials ud.

Jeg har en DB struktur bestående af tre databaser, 1 til "systemlogs" kaldet log.
1 til systemer kaldet systems.
1 til at håndtere mange-til-mange relation mellem de to andre kaldet dependency.

Jeg har id-felter på alle tre tabellers indhold.
Desuden har en log-id, en relation til systems iform af feltet log.systemId.
Jeg skal trække hele log-tabellen ud, og istedet for at vise systemId skal den vise systemnavnet (på baggrund af systems.name).
Desuden skal den hver gang et logId eksisterer i dependency tabellen hente denne log ud flere gange og angive hvilket systemId der tilhøres i dependency.

Håber det er nogenlunde forståeligt, ellers må i spørge.

SELECT log.id, systems.name, log.action, log.time, log.dependencyBool, dependency.systemId, log.initials FROM log, systems LEFT OUTER JOIN dependency ON dependency.logId = log.id WHERE log.active=1 AND dependency.systemId = systems.name ORDER BY `time` DESC

Fejlbeskeden:
#1054 - Unknown column 'log.id' in 'on clause'
Avatar billede arne_v Ekspert
05. februar 2012 - 20:47 #1
proev og lav en JOIN mellem log og systems

jeg tror at

FROM log, systems LEFT OUTER JOIN dependency ON dependency.logId = log.id

laeses som

FROM log, (systems LEFT OUTER JOIN dependency ON dependency.logId = log.id)
Avatar billede machholdt Nybegynder
05. februar 2012 - 20:56 #2
Hmm.

SELECT log.id, systems.name, log.action, log.time, log.dependencyBool, dependency.systemId, log.initials FROM log join systems LEFT OUTER JOIN dependency ON dependency.logId = log.id WHERE log.active=1 AND dependency.systemId = systems.name ORDER BY `time` DESC

Returnerer ingen rækker
Avatar billede arne_v Ekspert
05. februar 2012 - 21:06 #3
FROM (log join systems ON ???=???) LEFT OUTER JOIN dependency ON dependency.logId = log.id
Avatar billede machholdt Nybegynder
05. februar 2012 - 21:21 #4
Ja, næsten. Dog returneres stadig et systemId fra dependency-tabellen. Kan jeg hente det systemnavn der hører til dette systemId samtidig ?

SELECT log.id, systems.name, log.action, log.time, log.dependencyBool, dependency.systemId, log.initials FROM (log join systems ON log.systemId=systems.id) LEFT OUTER JOIN dependency ON dependency.logId = log.id WHERE log.active=1 ORDER BY `time` DESC
Avatar billede arne_v Ekspert
05. februar 2012 - 22:41 #5
du har systems.name i listen med felter du selecter??
Avatar billede machholdt Nybegynder
06. februar 2012 - 12:41 #6
Ja, men skal jo sådan set bruge den to gange. Da hver enkelte log har et specifikt systemnavn tilknyttet. Men sagtens kan påvirke andre systemer (Ud fra dependency-tabellen). jeg vil have dependency.systemId vist som et systemnavn istedet?

Er det ligetil, siden du skriver det sådan? I så fald må du da gerne skære det ud i det velkendte materiale lidt tykkere end papir;-)
Avatar billede arne_v Ekspert
07. februar 2012 - 03:11 #7
saa skal du ogsaa joine dependency med systems
Avatar billede machholdt Nybegynder
07. februar 2012 - 13:16 #8
SELECT log.id, systems.name, log.action, log.time, log.dependencyBool, dependency.systemId, log.initials FROM (log JOIN systems ON log.systemId=systems.id) LEFT OUTER JOIN (dependency JOIN systems AS ss ON ss.id=dependency.systemId) ON dependency.logId = log.id WHERE log.active=1 ORDER BY `time` DESC

Dette giver mig samme resultat, hvad gør jeg forkert?

Det skal forresten nævnes at nogle af de resultater der hives ud har null-værdi i dependency.systemId feltet, har det betydning når jeg skal joine den?

Hvis det har vil jeg bare løse det med en default værdi som hedder 0, som så vil matche et ikke-system i systems. Vil det være forkert?
Avatar billede machholdt Nybegynder
07. februar 2012 - 14:25 #9
HEHE. Nu fik jeg det endelig til at virke:

SELECT log.id, systems.name, log.action, log.time, log.dependencyBool, sd.name as dependentSystem, log.initials FROM (log join systems ON log.systemId=systems.id) LEFT OUTER JOIN (dependency LEFT OUTER JOIN systems as sd ON dependency.systemId=sd.id) ON dependency.logId = log.id WHERE log.active=1 ORDER BY `time` DESC

Tak for hjælpen hr. V.
Vil de være så venlig at lægge et svar;-)
Avatar billede arne_v Ekspert
08. februar 2012 - 04:38 #10
svar
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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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