05. februar 2012 - 20:41Der 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'
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
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
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;-)
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?
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;-)
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.