Hur komma åt data i en databas via kopplingstabell?

Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

Hur komma åt data i en databas via kopplingstabell?

Jag har tables som heter:
"books" som innehåller book_id, och några till fält
"authors" som innehåller author_id och några till fält
sedan en kopplingstabell som innehåller "book_id" och "author_id"

Hur gör jag för att tex kunna plocka ut en författare och visa alla böcker som är associerade med denna?

Trädvy Permalänk
Medlem
Plats
Småland, långt ute i mörka skogen.
Registrerad
Maj 2018

Denna SQL-fråga listar alla böcker där Isaac Asimov står som författare:

SELECT "Bok"."Titel" FROM "Koppling", "Författare", "Bok" WHERE "Koppling"."FörfNr" = "Författare"."FörfNr" AND "Bok"."Boknr" = "Koppling"."Boknr" AND "Författare"."Namn" = 'Isaac Asimov'

Testat och bekräftat i LibreOffice Base. Funkar fint även när det är flera författare till samma bok, exempelvis en novell-samling.

Detta är ett exempel på en many to many relation.

Lade till lite indrag

Linux och Android

Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

@Adoby: Tack!
Jag har ytterligare en fråga, hur löser jag detta:

/* Lista boktyp, och för varje boktyp skillnaden i inköpspris mellan den dyraste och den billigaste boken! */ select booktypes.book_type, (greatest(books.purchase_price) - least(books.purchase_price)) as skillnad from books, booktypes where booktypes.book_type_id = books.book_type_id group by booktypes.book_type, skillnad

Det jag har skrivit fungerar inte som jag tänkt. Det finns tre bok-typer pocket, inbunden och häftad.

Edit: jag tror jag fick till det genom att använda max och min istället för greatest och least

Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

Nu har jag kört fast igen någon som har tips om hur jag ska lösa detta:

9.Lista den kategori som har den dyraste boken! select categories.category, max(books.purchase_price) from books, categories where categories.category_id = books.category_id group by categories.category

Jag får fram alla kategorier samt det dyraste priset för varje kategori, men jag vill bara ha den kategorin där det dyraste priset finns.

Trädvy Permalänk
Medlem
Registrerad
Maj 2012

Vilken databas använder du?
Syntaxen varierar beroende på databas.
i Microsoft SQL tror jag kan man skriva: select TOP 1 from ....
i mysql: select * from ... limit 1

Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

Ok, det är postgre sql, jag får kolla om top är något som går att använda för mig.

Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

Jag provade att sortera på pris samt använda LIMIT 1 och det funkade, tror dock inte att det var tänkt att man skulle lösa uppgiften så men men...

Trädvy Permalänk
Medlem
Registrerad
Apr 2018

@burton666: Du måste filtrera ut den dyraste boken i where-satsen med en sub-select (alternativt i joinen om du vill det).

Typ:

SELECT t2.Category FROM Books t1 INNER JOIN Categories t2 ON t1.Category_ID = t2.Category_ID WHERE t1.Purchase_Price = (SELECT MAX(Purchase_Price) FROM Books t11 WHERE t1.ID = t11.ID) --Vet inte om du har en ID-kolumn i Books men det löser du säkert.

En TOP 1 ska du endast använda om du alltid vill ha ett svar (rad). Det skulle ju till exempel kunna finnas två böcker som delar det högsta priset i olika kategorier.

Jag hade undvikt att använda komma-joins, jag tycker att det är mycket svårare att läsa.

Trädvy Permalänk
Medlem
Plats
Gävle
Registrerad
Sep 2005

tackar,

Jag har nu fastnat på en ytterligare uppgift:

"Lista förnamn och efternamn för den eller de författare som har med flest böcker i databasen"

select first_name, last_name, antal_böcker from (select first_name,last_name, count(title) antal_böcker from books natural join authorships natural join authors group by first_name,last_name order by antal_böcker desc) s1

Jag får ut alla författare samt antal böcker de skrivit men hur tusan får jag fram de med flest böcker?

Min tanke var:

select first_name, last_name, antal_böcker from (select first_name,last_name, count(title) antal_böcker from books natural join authorships natural join authors group by first_name,last_name order by antal_böcker desc) s1 group by first_name, last_name, antal_böcker having antal_böcker = max(antal_böcker)

Men det fungerar inte, jag förstår inte hur jag ska kunna jämföra resultatet från den första sub-queryn mot max-värdet

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2002

Kan du inte sortera på antal böcker och hämta ut den första positionen?

Trädvy Permalänk
Medlem
Plats
Mjölby
Registrerad
Nov 2010
Skrivet av burton666:

tackar,

Jag har nu fastnat på en ytterligare uppgift:

"Lista förnamn och efternamn för den eller de författare som har med flest böcker i databasen"

select first_name, last_name, antal_böcker from (select first_name,last_name, count(title) antal_böcker from books natural join authorships natural join authors group by first_name,last_name order by antal_böcker desc) s1

Jag får ut alla författare samt antal böcker de skrivit men hur tusan får jag fram de med flest böcker?

Min tanke var:

select first_name, last_name, antal_böcker from (select first_name,last_name, count(title) antal_böcker from books natural join authorships natural join authors group by first_name,last_name order by antal_böcker desc) s1 group by first_name, last_name, antal_böcker having antal_böcker = max(antal_böcker)

Men det fungerar inte, jag förstår inte hur jag ska kunna jämföra resultatet från den första sub-queryn mot max-värdet

Jag använder inte postgreSQL utan Oracle på jobbet men jag tänker mig något i stil med

SELECT t1.* FROM (SELECT first_name, last_name, SUM(antal_böcker) AS antal FROM authors, books WHERE author_id = book_id GROUP BY first_name, last_name ORDER BY antal DESC) t1 WHERE ROWNUM = 1

*edit
Vad som händer med SQL-frågan är att den summerar antalet böcker per författare genom SUM och GROUP BY. (SUM kräver GROUP BY annars går SQL-frågan till error)
Sedan sorterar frågan resultatet på antal (här har jag även satt ett alias på summeringen) och går i en descending order, dvs högst tal först.
Sist men inte minst så limiterar frågan antalet rader till 1.
SQL-frågan är inte korrekt om det finns fler författare med samma antal skrivna böcker i toppen.

Main-PC: Bitfenix Phenom Mini | Asus Z170I Pro | Intel I5 6600K | Kingston HyperX 16GB 2133Mhz DDR4 | EVGA GeForce GTX 1070 | Corsair SF450 |