Gorechild Skrevet 18. november 2016 Del Skrevet 18. november 2016 Jeg står fast på en skoleopgave: Oppgave 3Hvilke titler i Bokormen inneholder ordet fortelling (Hint: det kan forekomme hvor som helst i tittelen) og hva er etternavnene til forfatterne som har skrevet dem? dette skal hentes fra tabellene bok (kolonne tittel) og ansvarlig (kolonne Etternavn) mitt beste forsøk så langt er: SELECT Tittel, Etternavn FROM Bok, Ansvarlig WHERE Tittel LIKE "%fortelling%" men da får jeg alle titlene, men med alle etternavnene knyttet til hver av titlene som inneholder fortelling og ikke til de respektive etternavnene. Hva gjør jeg galt og hva bør jeg gjøre for å nærme meg målet? Lenke til kommentar
Crowly Skrevet 18. november 2016 Del Skrevet 18. november 2016 Du må se på JOINS SELECT b.Tittel, a.Etternavn FROM Bok AS b INNER JOIN Ansvarlig AS a ON <koblings kriterie her som jeg lar deg finne ut av> WHERE b.Tittel LIKE "%fortelling%" I stedet for LIKE "%fortelling%" så kan du bruke funksjoner som INSTR(), funksjon navn kan variere fra database til database, her mysql/mariadb: WHERE INSTR(b.Tittel, 'fortelling') > 0 Lenke til kommentar
Gorechild Skrevet 18. november 2016 Forfatter Del Skrevet 18. november 2016 alt jeg prøver feiler. men jeg ser atr jeg har tabel Utgivelse med kolonne AndsvarligID den går også igjen under ansvarlig. Hjernen blir til grøt men jeg ser at det må trekkes en logisk kobling mellom Bok.Tittel Bok.ISBN Utgivelse.ISBN Utgivelse.AnsvarligID Ansvarlig.AnsvarligID det er bare da jeg ser en samenheng mellom dataene som jeg skal få fram, men jeg har gått så i sirkel at jeg snart gir opp. Lenke til kommentar
Gorechild Skrevet 18. november 2016 Forfatter Del Skrevet 18. november 2016 SELECT Utgivelse.AnsvarligID, Utgivelse.ISBN, Ansvarlig.AnsvarligID, Ansvarlig.Etternavn, Bok.Tittel, Bok.ISBN, FROM Ansvarlig, Bok, Utgivelse Where Bok.Tittel LIKE "%fortelling%" AND Bok.ISBN = Utgivelse.ISBN AND Utgivelse.ISBN = Utgivelse.AnsvarligID AND Utgivelse.AnsvarligID = Ansvarlig.AnsvarligID AND Ansvarlig.AnsvarligID = Ansvarlig.Etternavn; Dette er det jeg har kommet fram til så langt. Gode gamle Syntax error. Lenke til kommentar
tHz Skrevet 18. november 2016 Del Skrevet 18. november 2016 SELECT Utgivelse.AnsvarligID, Utgivelse.ISBN, Ansvarlig.AnsvarligID, Ansvarlig.Etternavn, Bok.Tittel, Bok.ISBN, FROM Ansvarlig, Bok, Utgivelse Where Bok.Tittel LIKE "%fortelling%" AND Bok.ISBN = Utgivelse.ISBN AND Utgivelse.ISBN = Utgivelse.AnsvarligID AND Utgivelse.AnsvarligID = Ansvarlig.AnsvarligID AND Ansvarlig.AnsvarligID = Ansvarlig.Etternavn; Dette er det jeg har kommet fram til så langt. Gode gamle Syntax error. Bruk joins. Den måten du skriver der er litt tidlig 90-talls mysql Begyn slik: SELECT * FROM Bok WHERE Bok.Tittel LIKE "%fortelling%" Så legger du til neste join SELECT * FROM Bok INNER JOIN UtgivelseON Bok.ISBN = Utgivelse.ISBN WHERE Bok.Tittel LIKE "%fortelling%" Sjekk om det fungerer Så tar du neste join SELECT * FROM Bok INNER JOIN Utgivelse ON Bok.ISBN = Utgivelse.ISBN INNER JOIN Ansvarlig ON Utgivelse.AnsvarligID = Ansvarlig.AnsvarligID WHERE Bok.Tittel LIKE "%fortelling%" etc. etterhvert kan du også erstatte * med relevante kolonner. Du kan også bruke alias slik noen over anbefaler, men å bruke enkeltbokstaver kan fort bli uleselig. Det er en dårlig vane å legge seg til. Bruk gjerne alias, men da bør alias være like forklarende som tabellnavn. Så kan du velge hvilken kolonner du vil ha ut INNER JOIN kan også skriver JOIN, da den blir en INNER JOIN per default. Men det er en god praksis å være spesifikk. INNER JOIN forutsetter at alle tabellene som joines faktisk har en relasjon. Lenke til kommentar
Crowly Skrevet 18. november 2016 Del Skrevet 18. november 2016 (endret) Når du kobler tabeller, om du gjør det på den gamle måten i WHERE eller i den nyere måten med JOINS, så må du koble på de feltene som logisk hører sammen. Hva har du tenkt her? AND Utgivelse.ISBN = Utgivelse.AnsvarligID -- og her AND Ansvarlig.AnsvarligID = Ansvarlig.Etternavn ISBN ser f.eks. slik ut: 978-3-16-148410-0AnsvarligID regner jeg med er en numerisk / integer verdi, f.eks. 52 Etternavn er ren tekst, f.eks. 'Hansen' Så hvis vi erstatter feltene med faktiske verdier så ender vi opp med noe ala dette: AND '978-3-16-148410-'0 = '978-3-16-148410-0' AND '978-3-16-148410-0' = 52 AND 52 = 52 AND 52 = 'Hansen' Da bør det bli veldig klart hvor du har gjort feil. Du bør gå bort i fra å gjøre joins i WHERE og heller ta i bruk JOIN syntaksen, er flere muligheter. Det du har gjort i WHERE tilsvarer INNER JOIN. Endret 18. november 2016 av Crowly Lenke til kommentar
Gorechild Skrevet 18. november 2016 Forfatter Del Skrevet 18. november 2016 Ok da skjønte jeg hvordan jeg linker to tabeller med koresponderende data med en INNER JOIN. Hvordan velger jeg da hvilke av de oppgitte kolonnene jeg vil ha ut? for nå får jeg svaret med en hel masse ekstra kolonner som jeg ikke ønsker. Lenke til kommentar
Gorechild Skrevet 18. november 2016 Forfatter Del Skrevet 18. november 2016 SELECT Etternavn, Tittel FROM Bok INNER JOIN Utgivelse ON Bok.ISBN = Utgivelse.ISBN INNER JOIN Ansvarlig ON Utgivelse.AnsvarligID = Ansvarlig.AnsvarligID WHERE Bok.Tittel LIKE "%fortelling%" Og da virket alt som det skulle. Takk for hjelpen. Skal klare å lære meg dette. Så er det å lære det til fruen som skal lære det pga skolen. Hjeper bare man ser den strukturelle oppbyggingen og hva som er rett syntax. Lenke til kommentar
Crowly Skrevet 19. november 2016 Del Skrevet 19. november 2016 SELECT Etternavn, Tittel FROM Bok INNER JOIN Utgivelse ON Bok.ISBN = Utgivelse.ISBN INNER JOIN Ansvarlig ON Utgivelse.AnsvarligID = Ansvarlig.AnsvarligID WHERE Bok.Tittel LIKE "%fortelling%" Hvordan velger jeg da hvilke av de oppgitte kolonnene jeg vil ha ut? Grunnen til at dette fungerer er fordi Etternavn og Tittel er unike felt navn på tvers av alle involverte tabeller. For å velge ett felt fra en spesifikk tabell så gjør du akkurat slik du har gjort i ON delen av JOIN'en i SELECT: tabell.feltNavn eller alias.feltNavn (se under) SELECT Bok.Tittel, Ansvarlig.Etternavn FROM ... Du kan også bruke alias på tabellen, det gjør du med å sette ett nytt navn etter tabell navnet, man bruker nøkkelordet AS for å angi alias (men AS er valgfritt). For å sette alias på tabellen Utgivelse gjør du INNER JOIN Utgivelse AS utg ON Bok.ISBN = Utg.ISBN Så hver gang du skal gjøre noe med Utgivelse tabellen i denne spørringen så kan du bruke utg i stedet for. Hvis du skal hente ut flere felt med samme navn fra forskjellige tabeller, så må du angi ett alias på feltene. F.eks. hvis Ansvarlig tabellen også har ett Tittel felt så gjør du: SELECT bok.Tittel AS bokTittel, Ansvarlig.Tittel AS ansvarligTittel FROM ... Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå