Gå til innhold

Hvordan gjennomføre denne relasjonen? (MySQL)


Anbefalte innlegg

La oss si jeg har 2 databaser, en med gjenstander og en med personer.

Eksempel:

PERSONER:
|  id  |  navn  |  gjenstander  |
|   1  |  jens  |  ?            |
|   2  |  knut  |  ?            |

GJENSTANDER:
|  id  |  gjenstand  |
|   1  |  kniv       |
|   2  |  gaffel     |
|   3  |  genser     |
|   4  |  bukse      |

Hvordan får jeg nå til at "jens" viser til at han har både "kniv" og "gaffel", mens "knut" har "kniv" og "bukse" etc.?

 

Vi tenker array i PHP, men det bør jo gjøres i MySQL. Mer entydig blir vel spørsmålet: Hvordan dele opp en mange til mange-relasjon via en mellomtabell?

Endret av clvn
Lenke til kommentar
Videoannonse
Annonse

Personer: pk_id, navn

Gjenstander: pk_id, navn

Personer_X_Gjenstander: pk_id (auto increment), fk_person_id, fk_gjenstands_id

 

Edit: Grunnen til at jeg har en auto increment pk_id i trans-tabellen er egentlig bare gammel vane. fk_person_id og fk_gjenstands_id kan være sammensatt primærnøkkel om du vil...

Endret av Manfred
Lenke til kommentar
Personer: pk_id, navn

Gjenstander: pk_id, navn

Personer_X_Gjenstander: pk_id (auto increment), fk_person_id, fk_gjenstands_id

 

Edit: Grunnen til at jeg har en auto increment pk_id i trans-tabellen er egentlig bare gammel vane. fk_person_id og fk_gjenstands_id kan være sammensatt primærnøkkel om du vil...

9004476[/snapback]

 

Bare for sikkerhets skyld:

 

Som gjøres ved å legge til denne: "primary key(fk_person_id, fk_person_id)" på slutten av query.

Lenke til kommentar
Personer: pk_id, navn

Gjenstander: pk_id, navn

Personer_X_Gjenstander: pk_id (auto increment), fk_person_id, fk_gjenstands_id

 

Edit: Grunnen til at jeg har en auto increment pk_id i trans-tabellen er egentlig bare gammel vane. fk_person_id og fk_gjenstands_id kan være sammensatt primærnøkkel om du vil...

9004476[/snapback]

 

Hvis du gjør det på den måten så må du iallefall lage en unique contraint eller index på fk_person_id og fk_gjenstands_id.

Lenke til kommentar

Noen som kan gi eksempel på en spørring der man henter ut alle personer som har en "gaffel" (fra eksempel 1)?

 

Vi kaller tabellen som inneholder relasjonen mellom "personer" og "gjenstander" for "personer_x_gjenstander".

 

(Det er vel her "join" eller "left join" kommer inn?)

Lenke til kommentar
SELECT * FROM Personer RIGHT JOIN Personer_X_Gjenstander ON fk_person_id = Personer.pk_id WHERE fk_gjenstands_id = 2

f.eks?

9032531[/snapback]

Ja, dette var akkurat det vi prøvde å få til. Tusen Takk!

Lenke til kommentar
  • 1 måned senere...

Bruk heller en INNER JOIN. RIGHT JOIN gir ingen mening så lenge du filtrerer på RIGHT JOIN tabellen i WHERE delen av spørringen (med mindre du bruker IS NULL i filteret).

 

Dessuten har jeg som leveregel å alltid gi tabeller et alias og prefixe alle kolonner med aliasnavnet. Da unngår du problemer hvis flere tabeller inneholder samme kolonnenavn.

 

SELECT * FROM Personer p INNER JOIN Personer_X_Gjenstander pg ON pg.fk_person_id = p.pk_id WHERE pg.fk_gjenstands_id = 2

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