Avatar billede Hans1 Praktikant
24. september 2012 - 17:44 Der er 51 kommentarer og
1 løsning

Relationer i mellem databaser

Hey

Når man arbejder med relationer i tabeller er der så noget man skal være opmærksom på?
Jeg har tænkt mig at oprette 3 tabeller - Udlån, brugere samt produkter.

Det skal være sådan at en bruger kan have mange udlån men et produkt kan kun være udlånt til en ad gangen.

I tabellern users laver jeg user_ID som primær nøgle.
I tabellen products laver jeg product_ID primær nøgle.

Jeg er lidt i tvivl omkring primær på udlåns tabellen.


-- Udlaan --

user_ID
product_ID

-- Users --

user_ID
username
firstname
lastname
email

-- Products --
product_ID
productname
Avatar billede arne_v Ekspert
24. september 2012 - 17:47 #1
primaernoeglen skal nok bestaa af begge felter
Avatar billede Hans1 Praktikant
24. september 2012 - 17:50 #2
Kan man sætte begge som primær?
Avatar billede Hans1 Praktikant
24. september 2012 - 18:02 #3
Hvornår benytter man innoDB og foreign key?
Avatar billede arne_v Ekspert
24. september 2012 - 18:13 #4
Du kan kun have 1 primaernoegle men den kan godt bestaa af flere felter.
Avatar billede arne_v Ekspert
24. september 2012 - 18:15 #5
du kan lave 2 foreign key constraints paa din udlaans tabel (en for hver felt)

hvis du kan det saa vil MySQL give dig en fejl, hvis du forsoeger at lave et udlaan med en bruger som ikke er i bruger tabellen eller et produkt som ikke er i produkt tabellen - det er godt!
Avatar billede Hans1 Praktikant
24. september 2012 - 18:32 #6
Hvordan tilføjer det i denne kode?

CREATE TABLE IF NOT EXISTS `udlaan` (
  `user_ID` bigint(20) NOT NULL,
  `product_ID` bigint(20) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Avatar billede Hans1 Praktikant
24. september 2012 - 18:34 #7
Skal alle 3 tabeller være af typen innodb?
Avatar billede arne_v Ekspert
24. september 2012 - 18:39 #8
alle 3 skal vaere InnoDB
Avatar billede arne_v Ekspert
24. september 2012 - 18:40 #9
Avatar billede Hans1 Praktikant
24. september 2012 - 19:13 #10
Er det sådan her?


CREATE TABLE IF NOT EXISTS `udlaan` (
  `user_ID` bigint(20) NOT NULL,
  `product_ID` bigint(20) NOT NULL
FOREIGN KEY (user_ID) REFERENCES users(user_ID)
FOREIGN KEY (product_ID) REFERENCES users(product_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Avatar billede arne_v Ekspert
24. september 2012 - 19:42 #11
Det ser rigtigt ud.
Avatar billede arne_v Ekspert
24. september 2012 - 19:43 #12
Du forventer mange brugere?

:-)
Avatar billede Hans1 Praktikant
24. september 2012 - 19:46 #13
Jeg er bare på den sikre side :)
Avatar billede Hans1 Praktikant
24. september 2012 - 20:03 #14
Hvid vi nu tager udgangspunkt i følgende:

-- Udlaan --

user_ID
product_ID

-- Users --

user_ID
username
firstname
lastname
email

-- Products --
product_ID
productname

Hvordan laver jeg en select som viser de produkter som brugeren med ID 1 har?
Avatar billede arne_v Ekspert
24. september 2012 - 20:58 #15
Du joiner de 3 tabeller og saetter en betingelse paa.
Avatar billede Hans1 Praktikant
25. september 2012 - 16:16 #16
Er denne måde lige så god?

select * from Products
where product_ID in (select product_id from udlaan where user_id = 1)
Avatar billede arne_v Ekspert
25. september 2012 - 16:23 #17
ja

men ved visse andre queries vil du vaere noed til at bruge join
Avatar billede Hans1 Praktikant
25. september 2012 - 16:34 #18
Hvordan ser dette ud?

Select *
From products
Join hvilken-tabel-her on udlaan.user_id = users.user_id
Where user_id = 1
Avatar billede arne_v Ekspert
25. september 2012 - 16:44 #19
Select *
From products
Join udlaan on products.product_id = udlaan.product_id
Where udlaan.user_id = 1

vil jeg tro.
Avatar billede Hans1 Praktikant
25. september 2012 - 16:46 #20
Hvad er forkskellen på ovenstående og det man kalder "left join"
Avatar billede arne_v Ekspert
25. september 2012 - 16:57 #21
x JOIN y

tager alle kombinationer hvor der er matchende raekker i baade x og y

x LEFT JOIN y

tager alle raekker fra x, hvis der er en matchende raekke i y tages denne eller fyldes der NULL i y kolonnerne
Avatar billede Hans1 Praktikant
25. september 2012 - 17:07 #22
Super.

Hvordan ville select sætningen så se ud hvis jeg havde en yderligere kolonne som hed "productname" og jeg i stedet for "productname" i tabellen "product" havde en kolonne som hed productname_id

SÅ jeg henter produkt navnet fra en anden tabel.
Avatar billede arne_v Ekspert
25. september 2012 - 17:13 #23
saa joiner du ogsaa den tabel ind
Avatar billede arne_v Ekspert
25. september 2012 - 17:15 #24
forskellen paa joins og diverse andet er forklaret her:

http://www.eksperten.dk/guide/389
Avatar billede Hans1 Praktikant
25. september 2012 - 17:25 #25
Hvordan kan de være at du ikke har lavet et eksempel med kun join.
Er join og inner join det samme?
Avatar billede arne_v Ekspert
25. september 2012 - 17:50 #26
ja
Avatar billede Hans1 Praktikant
25. september 2012 - 18:06 #27
Joiner jeg så bare den nye tabel på denne måde:

Select *
From products
Join udlaan on products.productname_id = productsname.productname_id
Join udlaan on products.product_id = udlaan.product_id
Where udlaan.user_id = 1
Avatar billede Hans1 Praktikant
25. september 2012 - 18:07 #28
Nu skal begge joins måske ikke være udlaan ved join.
Avatar billede arne_v Ekspert
25. september 2012 - 21:41 #29
nej det skal naturligvis vaere de rigtige tabelnavne

Select *
From products
Join productsname on products.productname_id = productsname.productname_id
Join udlaan on products.product_id = udlaan.product_id
Where udlaan.user_id = 1
Avatar billede Hans1 Praktikant
25. september 2012 - 22:08 #30
Tak for hjælpen Arne. Smid gerne et svar,
Avatar billede arne_v Ekspert
25. september 2012 - 22:16 #31
svar
Avatar billede Hans1 Praktikant
26. september 2012 - 15:11 #32
Det virker ikke når jeg tilføjer følgende i forhold til #29:

Join productsname on products.productname_id = productsname.productname_id

Jeg får blot udskrevet id tallene skrevet i product tabellen. den tager det ikke fra productname tabellen.
Avatar billede arne_v Ekspert
26. september 2012 - 15:26 #33
kan du poste hele SQL'en?
Avatar billede Hans1 Praktikant
26. september 2012 - 15:47 #34
Yes.

Her får du den opdaterede version. Nu bruger lige første kolonne.

SELECT `manufacturer_id`, `productname` FROM `products` Join `manufacturers` on `manufacturers`.`id` = `products`.`manufacturer_id` Join `lendings` on `products`.`id` = `lendings`.`product_id` Where `lendings`.`user_id` = ?

-manufacturers-
id
name

-products-
id
manufacturer_id
productname

-users-
id
firstname

-lendings-
user_id
product_id
Avatar billede arne_v Ekspert
26. september 2012 - 16:02 #35
put flere felter i SELECT output og angiv med tabel navn.

SELECT tabel1.felt1,tabel2.felt2,tabel3.felt3,tabel3.felt4 FROM ...
Avatar billede Hans1 Praktikant
26. september 2012 - 16:33 #36
skriver man så dette ved from.

... FROM tabel1, tabel2, tabel3
Avatar billede Hans1 Praktikant
26. september 2012 - 16:56 #37
Skulle det ikke kun være Inner join med JOIN (den nye måde)

Er #35 ikke den gamle måde i forhold til din artikel?
Avatar billede arne_v Ekspert
27. september 2012 - 04:25 #38
Jeg vil foreslaa den nye maade, men den gamle maade virker stadig.
Avatar billede arne_v Ekspert
27. september 2012 - 04:26 #39
Altsaa hvorvidt man bruger JOIN eller komma mellem tabeller.

Man bruger altid komma mellem felter.
Avatar billede Hans1 Praktikant
27. september 2012 - 08:58 #40
Skal man skrive tabellen to gange i From hvis man henter fra mere end en kolonne i tabellen?

SELECT tabel1.felt1, tabel1.felt2, tabel2.felt1 FROM tabel1, tabel1, tabel2
Avatar billede arne_v Ekspert
27. september 2012 - 15:04 #41
nej

du skal kun angive en tabel 2 gange i FROM hvis du vil have fat i 2 forskellige raekker fra den (self join)
Avatar billede Hans1 Praktikant
27. september 2012 - 15:16 #42
Okay.

Hvorfor får jeg så følgende fejl: Not unique table/alias: 'manufacturers'

SELECT `products`.`manufacturer_id`, `products`.`productname`, `manufacturers`.`id`, `manufacturers`.`name`
FROM `products`, `manufacturers`
Join `manufacturers` on `manufacturers`.`id` = `products`.`manufacturer_id`
JOIN `lendings` ON `products`.`id` = `lendings`.`product_id`
WHERE `lendings`.`user_id` = ?
Avatar billede arne_v Ekspert
27. september 2012 - 15:26 #43
fordi du netop har manufacurers to gange i from
Avatar billede Hans1 Praktikant
27. september 2012 - 15:34 #44
Mener du der i join?
Avatar billede arne_v Ekspert
27. september 2012 - 16:23 #45
FROM `products`, `manufacturers`    <---------- foerste gang
Join `manufacturers` on `manufacturers`.`id` = `products`.`manufacturer_id`    <-------- anden gang
Avatar billede Hans1 Praktikant
27. september 2012 - 16:35 #46
Når der. Hvilken en af dem skal jeg fjerne?

jeg skal jo sammenligne værdierne for manufacturerne i begge tabeller.
Avatar billede arne_v Ekspert
27. september 2012 - 16:46 #47
den foerste - jeg synes du skal bruge moderne JOIN
Avatar billede Hans1 Praktikant
27. september 2012 - 21:00 #48
Alt det der skal sammenlignes med hindanden skal det selectes?
Avatar billede arne_v Ekspert
28. september 2012 - 01:32 #49
nej

du skal kun selecte det som du skal bruge
Avatar billede Hans1 Praktikant
28. september 2012 - 06:35 #50
Når. Tak igen.
Avatar billede Hans1 Praktikant
09. november 2012 - 13:52 #51
Hvad gør jeg hvis jeg får samme værdi i et af felterne i begge rækker?
Avatar billede arne_v Ekspert
20. november 2012 - 01:22 #52
Er det et problem?
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