Avatar billede aske2 Nybegynder
15. januar 2015 - 19:26 Der er 7 kommentarer og
1 løsning

Hjælp til select

Hej eksperter

Er der en, der kan (og vil) lave en select for mig? Og ja jeg ved godt, jeg skal sætte mig ind i det, men... Lige nu skal jeg bare bruge selecten til at teste relationerne i databasen.

Ud fra nedenstående tabeller (med lidt data), vil jeg gerne lave en select, der viser alle book.title where borrower.name = 'John'.

Min søn skal til eksamen i morgen, så han er lidt presset på tid og... Joins er ikke en del af pensum. Håber der er en af jer, der vil hjælpe :)


CREATE TABLE book
(
  isbn varchar (100) not null,
  title varchar (100),
  type varchar (100),
  category varchar (100),
  primary key (isbn)
);

CREATE TABLE location
(
  locid MEDIUMINT NOT NULL AUTO_INCREMENT,
  location varchar (100),
  primary key (locid)
);


CREATE TABLE borrower
(
  ssn varchar (9) not null,
  name varchar (100),
  address varchar (100),
  phonenr varchar (100),
  email varchar (100),
  primary key (ssn)
);


CREATE TABLE author
(
  anum MEDIUMINT NOT NULL AUTO_INCREMENT,
  name varchar (100),
  primary key (anum)
);


CREATE TABLE author_book
(
  anum mediumint,
  isbn varchar (100),
  primary key (anum, isbn),
  foreign key (isbn) references book(isbn),
  foreign key (anum) references author(anum)
);


CREATE TABLE copy
(
  copynum integer not null,
  locid mediumint,
  isbn varchar (100),
  primary key (copynum, locid, isbn),
  foreign key (locid) references location(locid),
  foreign key (isbn) references book(isbn)
  );


CREATE TABLE transaction
(
  transid MEDIUMINT NOT NULL AUTO_INCREMENT,
  ssn varchar (9),
  copynum integer,
  locid mediumint,
  isbn varchar (100),
  lendingdate date,
  returndate date,
  primary key (transid),
  foreign key (ssn) references borrower(ssn),
  foreign key (copynum, locid, isbn) references copy(copynum, locid, isbn)
);


INSERT INTO book VALUES
('0-07-295886-3',  'Database system concepts', 'specialist literature', null),
('978-0131873254', 'Database systems: the complete book', 'specialist literature', null);


INSERT INTO `location`(`location`) VALUES
('681.3.07'),
('681.3.08'),
('681.3.09');


INSERT INTO `author`(`name`) VALUES ('Abraham Silberschatz'),
('Henry F. Korth'), ('S. Sudarshan'), ('Hector Garcia-Molina'),
('Jeffrey D. Ullman'), ('Jennifer Widom');


INSERT INTO `author_book` (`anum`, `isbn`) VALUES
('1', '0-07-295886-3'),
('2', '0-07-295886-3'),
('3', '0-07-295886-3'),
('4', '978-0131873254'),
('5', '978-0131873254'),
('6', '978-0131873254');


INSERT INTO `copy`(`copynum`,`locid`, `isbn`) VALUES
('1', '1', '0-07-295886-3'),
('2', '1', '0-07-295886-3'),
('1', '1', '978-0131873254'),
('2', '2', '978-0131873254'),
('3', '3', '978-0131873254');


INSERT INTO borrower VALUES
('123456789', 'John', 'Main Street 3', '456-54321', 'john@somewhere.com'),
('987654321', 'Joe', 'Railroad 24', '123-98765', 'joe@the.plummer');


INSERT INTO `transaction`(`ssn`, `copynum`, `locid`, `isbn`, `lendingdate`, `returndate`)
VALUES
('123456789', '1', '1', '0-07-295886-3', '2008-10-21', '2008-11-21'),
('987654321', '3', '3', '978-0131873254', '2008-10-25', '2008-11-25');
15. januar 2015 - 21:28 #1
Ikke testet, men prøv den følgende:

SELECT b.title
FROM book b
JOIN copy c WHERE b.isbn = c.isbn
JOIN transaction t WHERE c.copynum = t.copynum
JOIN borrower br WHERE t.ssn = br.ssn AND br.name = "John"
Avatar billede aske2 Nybegynder
15. januar 2015 - 22:26 #2
Christian_Belgien

Tak for forsøget, men det virkede desværre ikke :(

Jeg tror, filmen knækker for mig, fordi primary key i copy (og foreign key i transaction) er compound keys (copynum, locid, isbn)

Jeg har virkelig kæmpet, men jeg kender ikke syntaksen :/

Jeg har lavet denne (der fungerer):

SELECT author.name
FROM author
INNER JOIN author_book
on author.anum=author_book.anum
INNER JOIN book
on author_book.isbn=book.isbn
WHERE title = "Database system concepts"

Og når jeg forsøger at lave noget tilsvarende med den anden, så går jeg i stå her:

on copy.xxxx = transaction.xxx

Det er jo en sammensat nøgle, der relaterer de 2 tabeller.

Forstår du, hvad jeg mener? Det er lidt svært at forklare - især fordi, jeg på ingen måde er SQL-haj ;)
15. januar 2015 - 23:06 #3
Nej, det er mig der vrøvler.  Det er for længe siden jeg selv har været igang hermed.  Det skulle være:

SELECT b.title
FROM book b
JOIN copy c ON b.isbn = c.isbn
JOIN transaction t on c.copynum = t.copynum
JOIN borrower br on t.ssn = br.ssn WHERE br.name = "John"
Avatar billede aske2 Nybegynder
16. januar 2015 - 14:22 #4
Christian_Belgien >

Nu eksekverede den SQL, men... Resultatet af selecten var bare ikke korrekt.

Der er 2 transactions i tabellen transaction, og selecten returnerede dem begge, men...

De 2 transactions indeholder 2 forskellige ssn, og der skulle derfor kun returneres en record.

Sønnen har i øvrigt været til eksamen i dag - og trak desværre IKKE SQL - men... Nu har jeg fået blod på tanden, så jeg er da stadig interesseret i at finde løsningen :)
16. januar 2015 - 15:15 #5
Jeg kikkede igen, denne gang lidt længere, og jeg ser, at isbn nummeret på en lånt bog står i tabellen transaction.  Derfor skulle denne query (forhåbenligt) virke:

SELECT title FROM book b
JOIN transaction t ON b.isbn = t.isbn
JOIN borrower br ON t.ssn = br.ssn
WHERE br.name = "John"
23. januar 2015 - 09:15 #6
aske2, kom du fra det igen?  Kunne du bruge mit indlæg #5, eller giver det stadig problemer?  I så fald hvilke?  Eller er spørgsmålet ikke længere aktuelt?  I så fald luk det venligst igen, ved at acceptere dette svar hvis du mener jeg har været til hjælp, eller ved eget svar.
23. januar 2015 - 09:16 #7
Det skulle have været et svar.
Avatar billede aske2 Nybegynder
23. januar 2015 - 10:12 #8
Christian_Belgien >

Jeg beklager mit sene svar, men jeg har ligget vandret.

Det så ud til at fungere, men jeg har ikke gennemtestet, men...

Jeg takker så meget for din hjælp :) God weekend, når den tid kommer :)
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester