Avatar billede pumpin Nybegynder
16. august 2006 - 17:47 Der er 5 kommentarer og
1 løsning

inner join

Hej eksperter!

Jeg har 2 tabler som jeg skal trække ud fra, moebler og billeder de er bygge sådan her op:
Billeder:
id, fk_moeblerid, sti.

MOEBLER:
id, varenr, pris, beskrivelse, type, designer, aar.

Det som jeg gerne vil er at trække alle møbler ud som har type=1 ( der er kun en pt ) og de 3 billeder som hører til det ENE møbel.

men når jeg gør det så viser den 3 rækker, alle af samme møbel, og hvert sit billede.

jeg bruger den her SQL string:

SELECT BILLEDER.sti, MOEBLER.varenr, MOEBLER.navn, MOEBLER.fk_type, MOEBLER.fk_designer, MOEBLER.aar, MOEBLER.pris, MOEBLER.beskrivelse FROM BILLEDER INNER JOIN MOEBLER ON BILLEDER.fk_moebelid = MOEBLER.id WHERE (MOEBLER.fk_type = 1)

hvordan gør jeg det og kan det overhovede lade sig gøre ?
Avatar billede pumpin Nybegynder
16. august 2006 - 21:20 #1
det som jeg faktisk gerne bare vil er at

hvis man har 2 tabels en tabel1 og tabel2 :)

tabel1 har 1 række med feltet id  = 1

tabel2 har 3 rækker med feltet fk_id = 1

så ønsker jeg bare den felterne fra tabel1's ene række og alle felterne fra KUN en af de 3 rækker i tabel2

håber det kaster lidt mere lys over det
Avatar billede kjulius Novice
16. august 2006 - 22:54 #2
Prøv med

SELECT BILLEDER.sti, MOEBLER.varenr, MOEBLER.navn, MOEBLER.fk_type, MOEBLER.fk_designer, MOEBLER.aar, MOEBLER.pris, MOEBLER.beskrivelse
FROM MOEBLER
FROM (SELECT fk_moebelid, MIN(id) AS MINid FROM BILLEDER GROUP BY fk_moebelid) AS M
  ON M.fk_moebelid = MOEBLER.id
INNER JOIN BILLEDER ON BILLEDER.id = M.id
WHERE (MOEBLER.fk_type = 1)

eller

SELECT BILLEDER.sti, MOEBLER.varenr, MOEBLER.navn, MOEBLER.fk_type, MOEBLER.fk_designer, MOEBLER.aar, MOEBLER.pris, MOEBLER.beskrivelse
FROM BILLEDER
INNER JOIN MOEBLER
  ON BILLEDER.fk_moebelid = MOEBLER.id
WHERE (MOEBLER.fk_type = 1)
  AND BILLEDER.id =
  (
  SELECT MIN(id)
  FROM BILLEDER M
  WHERE B.fk_moebelid = BILLEDER.fk_moebelid
  )
Avatar billede teepee Nybegynder
17. august 2006 - 11:24 #3
Du kunne tilføje en markering i billedtabellen som markerer det billede du gerne vil udtrække, til f.eks. forsiden, og dermed bliver sql'en også meget simplere, så skal du bare tilføje f.eks. WHERE billeder.paa_forsiden = 1
Avatar billede kjulius Novice
17. august 2006 - 13:43 #4
I mit sidste bidrag opdager jeg til min rædsel (nå.. ok, måske ikke ligefrem rædsel, men så ubehag da *G*), at jeg har benyttet et forkert navn på aliaset.

Det skulle naturligvis have været:

...
WHERE (MOEBLER.fk_type = 1)
  AND BILLEDER.id =
  (
  SELECT MIN(id)
  FROM BILLEDER B
  WHERE B.fk_moebelid = BILLEDER.fk_moebelid
  )
Avatar billede kjulius Novice
17. august 2006 - 14:13 #5
teepee har naturligvis ret i, at hvis det er vigtigt hvilket af billederne der vises, så er den eneste rigtige vej at markere det billede, der er det "vigtigste".

Jeg gik ud fra, at du principielt var ligeglad med, hvilket af billederne der vistes, bare der kun kom et billede pr. produkt. Det var ligesom det, dit spørgsmål spørgsmål fik mig til at tro.

Nu efter at have genlæst spørgsmålet er jeg kommet lidt i tvivl.

Du skriver:

"Det som jeg gerne vil er at trække alle møbler ud som har type=1 ( der er kun en pt ) og de 3 billeder som hører til det ENE møbel.

men når jeg gør det så viser den 3 rækker, alle af samme møbel, og hvert sit billede."

Det er jo lidt selvmodsigende. På den ene side vil du have vist alle tre billeder. På den anden side vil du ikke have vist informationerne der er fælles for billederne tre gange? Det er nu engang sådan SQL virker. Det er så op til dig i dit program at behandle disse data, hvis du f.eks. vil have vist data fra moebler 1 gang og herefter de tre billeder.

Hvis det er der det strander, så er det faktisk ofte bedre at gøre det som to forespørgsler (især hvis du kun vil vise 1 møbel ad gangen). Altså:

1. Indlæs data fra MOEBLER på dit produkt
2. Udskrive data i dit program
3. Indlæs data fra BILLEDER, hvor du angiver indholdet fra id i MOEBLER som kriterie.
4. Loop gennem billederne og vis dem i dit program

Hvis du vil bruge det til f.eks. et katalog, hvor du vil liste alle dine varer med tilhørende billeder, kan det til gengæld være en fordel at benytte sig af den metode du bruger i dit spørgsmål. Her vil du så skulle gennemløbe alle rækker, og så udskrive vareoplysninger hver gang der er brud på MOEBLER.id (brud på = den skifter værdi)

Jeg ved ikke, om noget af dette dækker dit problem. Ellers må du uddybe...
Avatar billede pumpin Nybegynder
17. august 2006 - 18:16 #6
lige pt tester jeg på liv og løs jeres dejlige forslag. vender skarpt tilbage i aften/nat
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