Gå til innhold

Hente informasjon fra flere tabeller


Anbefalte innlegg

Hei,

 

Jeg holder på å lage et system hvor feil, service ol. informasjon kan registreres og hentes ut. Det problemet jeg har nå er at dersom en bruker søker på en "robot" skal all informasjon om denne roboten dukke opp og sorteres på dato. Tabellen robot_error er enkel og det er denne koden tar utgangspunkt i. Problemet er når jeg skal hente servicer. I tabellen service er det bare generell informasjon, dato, kommentar osv - mens tabellen service_robot_errorservice inneholder den spesifike informasjonen som feks hvilken robot, status på robot osv.

 

Hvordan kan jeg strukturere koden for å hente ut all denne informasjonen og sortere på dato? Jeg er rimelig sikker på at måten jeg har gjort det er lite effektiv, så tar gjerne i mot tips!

 

Her er koden: http://pastebin.com/VXUNYANe

 

Takk for alle innspill! :)

 

PS: Skal nevnes at tabellen service_robot_errorservice har en fremednøkkel som kobler den til tabellen service

Endret av Suspect
Lenke til kommentar
Videoannonse
Annonse

Ser denne er litt gammel, men kan svare likevel:

Det du lurer på er hva du skal skrive under //Get information from other tables og videre derfra?

 

Det høres ut for meg som du bør bruke noen JOIN i forespørslene dine, kjenner du til bruk av JOIN?

 

Hvis du trenger mer hjelp er det en fordel om du skriver opp tabelldefinisjonene for oss slik at det er lettere å forklare hvordan ting kobles sammen (både for deg og oss)

Lenke til kommentar

Hei,

 

Alt kan ikke samles i en tabell pga det er snakk om mange service tabeller siden det finnes mange forskjellige servicer, jeg ramset kun opp den ene for å få forklart hva jeg vil.

 

Under ser dere hvordan tabellene er bygget opp. Tabellen robot_error er utenforstående, mens service_robot_errorservice inneholder en fremmednøkkel som er PK i tabellen service.

 

Når en bruker søker på feks robot 54 vil jeg at all historikk fra robot_error og de forskjellige service tabellene dukker opp sortert på dato. Jeg har litt erfaring med JOIN men skulle nok kanskje hatt litt starthjelp :)

 

TABLE: robot_error

----------------------------------------------------------------------------------------------------------------------

| id | date | stop_time | start_time | robot | position | error_code | observation | solution | downtime | logged_by |

----------------------------------------------------------------------------------------------------------------------

| 1 | 02.01.2012 | 14:51:31 | 14:52:00 | 20 | 25/7 | 214 | Feilet i X retning | Ta av rob, start | 29 | XXX |

| 2 | 02.01.2012 | 14:59:00 | 15:00:00 | 54 | 58/17 | 168 | Portfeil | EACK, start | 60 | XXX |

----------------------------------------------------------------------------------------------------------------------

TABLE: service

----------------------------------------------------------------------------------------------

| service_id | service_date | service_module | service_user | service_comment | service_type |

----------------------------------------------------------------------------------------------

| 1 | 13.01.2012 | Robot | XXX | Test service | Errorservice |

| 2 | 04.01.2012 | Robot | XXX | Test basic | Basicservice |

----------------------------------------------------------------------------------------------

TABLE: service_robot_errorservice

-------------------------------------------------------------------------------------------------------

| errorservice_id | service_id | errorservice_robot | errorservice_tracksensor | errorservice_gripper |

-------------------------------------------------------------------------------------------------------

| 5 | 1 | 54 | OK | OK |

-------------------------------------------------------------------------------------------------------

Lenke til kommentar

Jeg har litt erfaring med JOIN men skulle nok kanskje hatt litt starthjelp :)

 

Kanskje noe slikt, har bare tatt med noen felt

SELECT re.dato, re.stop_time, re.robot, s.service_comment, s.service_type, sre.errorservice_tracksensor
FROM robot_error re
INNER JOIN service_robot_errorservice sre ON sre.errorservice_robot=re.robot
INNER JOIN service s ON s.service_id=sre.service_id
WHERE re.robot=54
ORDER BY re.dato

--

 

Litt generelt om joins:

 

 

Enkleste formen for join er vel INNER JOIN, hvor bare forekomster som finnes i begge tabellene blir med, f.eks

SELECT t1.felt1 AS f1, t1.felt2 AS f2, t2.felt1 AS f3, t2.felt2 AS f4
FROM tabell1 AS t1
INNER JOIN tabell2 AS t2 ON t1.id=t2.f_id

(AS nøkkelordet er ikke nødvendig for aliaser, men gjør det kanskje mer lesbart).

Her kobles tabell1 og tabell2 med kriteriet oppgitt etter ON, du kan oppgi flere kriterier f.eks med en id og dato:

INNER JOIN tabell2 AS t2 ON t1.f_id=t2.id AND t1.dato=t2.dato

 

Du kan koble flere enn to tabeller, er bare å legge til flere joins

SELECT t1.felt1 AS f1, t2.felt1 AS f2, t3.felt1 AS f3, t4.felt1 AS f4
FROM tabell1 AS t1
INNER JOIN tabell2 AS t2 ON t1.f_id=t2.id AND t1.dato=t2.dato
INNER JOIN tabell3 AS t3 ON t1.s_id=t3.id
LEFT OUTER JOIN tabell4 AS t4 ON t4.feltx=t2.felty

 

En annen praktisk join er (LEFT) OUTER JOIN, spørringen vil returnere rader, selv om tabellen koblet til med LEFT OUTER JOIN ikke har noen "treff". F.eks ett system for avis, hvor opplag er lagret i en tabell og sidetall i en annen

SELECT o.dato, o.tittel, o.antall, s.sider
FROM opplag o
INNER JOIN sider s ON o.dato=s.dato AND o.avis_id=s.avis_id
WHERE o.dato=TO_DATE('12.01.2012','DD.MM.YYYY') AND o.tittel='xxxx'

(Litt oracle syntaks på dato).

 

SELECT o.dato, o.tittel, o.antall, s.sider
FROM opplag o
LEFT OUTER JOIN sider s ON o.dato=s.dato AND o.avis_id=s.avis_id
WHERE o.dato=TO_DATE('12.01.2012','DD.MM.YYYY') AND o.tittel='xxxx'

 

Hvis f.eks. bare opplag eksisterer, men ikke sidetall for en gitt tittel og dato, så vil den første ikke gi noen treff, mens den andre hente frem en rad, hvor sider er NULL.

 

http://www.w3schools.com/sql/sql_join.asp

http://www.codeproject.com/KB/database/Visual_SQL_Joins.aspx (har også noen bilder som illustrerer utvalget ganske greit)

http://www.halfgaar.net/sql-joins-are-easy (også med bilder)

 

 

Denne boka har jeg lært mye av, Learning SQL, 2nd Edition (fra O'Reilly Media), bruker mysql som eksempel base, men tar for seg både oracle og ms sql i tillegg der de er forskjellig. Kan bestilles fra ymse bokhandlere i inn og utland :)

Endret av Crowly
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...