Avatar billede styrbaek Nybegynder
01. november 2007 - 11:11 Der er 15 kommentarer og
1 løsning

SELECT mange til mange

Jeg er ved at optimere min mysql database. Og har læst mig frem til at ved relationer er det en fordel at splitte sine tabeller op.

Jeg har i dag 2 tabeller

tbl_firma
id (PK)
Navn
Adresse

tbl_ordre
id (PK)
firma_id
ordrenr
varer
osv...

SELECT * from tbl_firma,tbl_ordre where tbl_ordre.firma_id = tbl_firma.id

Men kan forstå at istedt for at have firma_id så skal jeg lave en ny tabel

tbl_firma_ordre
firma_id
ordre_id

Mit spørgsmål er så hvordan i alverden laver jeg så min SELECT???
Avatar billede sherlock Nybegynder
01. november 2007 - 11:18 #1
For det første. Dit eksempel er ikke godt.
For en given ordre hører vel kun til hos een kunde? Så det er en een-til-mange relation og du skal ikke bruge en relationstabel.
Avatar billede pidgeot Nybegynder
01. november 2007 - 11:20 #2
Samme ordre kan vel kun tilhøre et firma? I så fald er det nemlig ikke en mange til mange-relation, men en til mange, og du skal ikke splitte den del op.
Avatar billede sherlock Nybegynder
01. november 2007 - 11:22 #3
Men ellers

SELECT *
from tbl_firma, tbl_firma_ordre,tbl_ordre
where tbl_firma_ordre.firma_id = tbl_firma.id 
  and tbl_firma_ordre.ordre_id = tbl_ordre.id
Avatar billede pidgeot Nybegynder
01. november 2007 - 11:22 #4
...og jeg skal VIRKELIG lære at opdatere inden jeg trykker Send ^-)
Avatar billede sherlock Nybegynder
01. november 2007 - 11:25 #5
Det giver kommentarerne lidt mere vægt, når vi siger det i kor :)
Avatar billede styrbaek Nybegynder
01. november 2007 - 11:26 #6
Tænkte nok der var noget jeg ikke havde fået helt fat i.
Hvad så hvis jeg også har en varertabel. Hver ordre kan indeholde flere varer og hver varer kan være i flere ordre.
Skal den relation så ikke laves i en ekstra tabel?
Avatar billede styrbaek Nybegynder
01. november 2007 - 11:27 #7
Ha ha lavede lige det samme nummer ;-)
Avatar billede pidgeot Nybegynder
01. november 2007 - 11:30 #8
Jo, ordre <-> varer skal være en relationstabel da det ganske korrekt er en *:*-relation.

Husk i øvrigt at man som oftest aldrig skal bruge alle data i relationstabellen, men kun skal bruge for en bestemt værdi af den ene side af relationen. Det giver med andre ord mest mening først at finde ordren, og så bagefter køre via relationstabellen for at få vareoplysninger.
Avatar billede styrbaek Nybegynder
01. november 2007 - 11:34 #9
Altså jeg har så lavet relationstabel

tbl_ordre_varer
ordre_id
varer_id

Har hentet ordren som har id = 1

Hvordan vil du så hente varerne via relationstabellen??
Avatar billede sherlock Nybegynder
01. november 2007 - 11:35 #10
Og så bør du nok lægge en tbl_ordrelinie ind mellem tbl_vare og tbl_ordre.

tbl_ordrelinie er salgsrelateret og afspejler den beskrivelse/pris/rabat +++, som varen havde på det tidspunkt den blev bestilt og antal.

tbl_vare er lagerrelateret og indeholder en antal på lager, indkøbspris, leverandør(ny tabel :)) +++++ find selv på.
Avatar billede sherlock Nybegynder
01. november 2007 - 11:39 #11
Hmm. tbl_ordrelinie er selvf. relationstabellen mellem ordre og vare.
Den er bare også noget mere :)
Avatar billede sherlock Nybegynder
01. november 2007 - 11:43 #12
SELECT *
from tbl_ordre , tbl_varer, tbl_ordre_varer
where tbl_ordre_varer.vare_id = tbl_vare.id 
  and tbl_ordre_varer.ordre_id = tbl_ordre.id
and tbl_ordre_varer.ordre_id = 1
Avatar billede styrbaek Nybegynder
01. november 2007 - 11:45 #13
Ik noget med INNERJOIN og lig. ???
Avatar billede sherlock Nybegynder
01. november 2007 - 12:19 #14
Ikke noget pjat :). Der er jo ingen nulls i det her. Enten er der en hel relation eller der er slet ikke nogen.
Når du kommer til at styre skærmbilleder, kan det være at du vil have specielle ordre-liner, f.eks. rene tekstlinier, formatteringslinier eller mellemregninger. Og så kan det komme på tale med andre typer joins. Men de kan også ligge i en helt anden tabel og hentes med en union. Og du skal have et sekvensnummer på dine ordrelinier, så du kan være sikker på rækkefølgen i dine skærmbilleder og udskrifter.
Avatar billede styrbaek Nybegynder
01. november 2007 - 12:30 #15
Jeg tror vi stopper her, så må vi fortsætte hvis det andet bliver aktuelt.
Hvis du lige ligger et svar så er pointene dine
Avatar billede sherlock Nybegynder
01. november 2007 - 12:43 #16
:) Tak og god fornøjelse.
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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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