Gå til innhold

Anbefalte innlegg

Jeg står fast på en skoleopgave: 

 

Oppgave 3

Hvilke 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
Videoannonse
Annonse

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

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
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

 

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

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-0

AnsvarligID 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 av Crowly
Lenke til kommentar

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

 

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

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å
×
×
  • Opprett ny...