Avatar billede jeffe Nybegynder
13. april 2006 - 20:46 Der er 12 kommentarer og
1 løsning

Besværligt SQL-udtræk

Jeg skal have lavet et udtræk af en art, jeg ikke har prøvet før.

Jeg har lyst til at afsløre præcis jeg er ved at bikse med, men dette er en nedkogt udgave af databasen, hvor det unødvendige er fjernet:

Tabel 'Navne':
Felter:

navn_id (int)
navn_navn (varchar)
navn_by1 (int)
navn_by2 (int)
navn_by3 (int)


Tabel 'Byer':
Felter:

by_postnr (int)
by_navn (varchar)



Så er der så en masse records i By-tabellen, med postnummer og by. Oppe i navne-tabellen skal der så angives i alt tre byer (hjemme, arbejde og x, eksempelvis). Men de angives jo med id/postnr deroppe i navne-tabellen. Det skal holdes op mod postnummer i by-tabellen, men hvis alle tre byer i en given navne-record er forskellige, skal den hente navne på tre forskellige byer og dermed tre forskellige records i ét udtræk!!

Jeg skal have et udtræk fra ovenstående så jeg stå med disse data:

navn_navn, navn_id, by1's bynavn (ikke id) samt de to andre byers navne og altså ikke id'er.

Gav det nogen som helst mening? :) På forhånd tak, i hvert fald!
Avatar billede morhan Novice
13. april 2006 - 21:09 #1
prøv sådan:

SELECT navn_navn, navn_id, byer1.by_navn AS by1, byer2.by_navn AS by2, byer3.by_navn AS by3 FROM navne
LEFT JOIN byer AS byer1 ON byer1.by_postnr=navne.navn_by1
LEFT JOIN byer AS byer2 ON byer2.by_postnr=navne.navn_by2
LEFT JOIN byer AS byer3 ON byer3.by_postnr=navne.navn_by3
Avatar billede hmortensen Nybegynder
13. april 2006 - 21:09 #2
Du kan lave aliases af 'byer' tabellen:
SELECT navn_navn, byer.by_navn, byer2.by_navn, byer3.by_navn
FROM navne
INNER JOIN byer
  ON navne.navn_by1 = byer.by_postnr
INNER JOIN byer as byer2
  ON navne.navn_by2 = byer2.by_postnr
INNER JOIN byer as byer3
  ON navne.navn_by3 = byer3.by_postnr
Avatar billede jeffe Nybegynder
13. april 2006 - 21:21 #3
Jeg kigger på det og vender tilbage. Foreløbigt tak!
Avatar billede jeffe Nybegynder
14. april 2006 - 23:08 #4
Jeg har lige prøvet at oprette tabellerne præcist som beskrevet ovenfor (og ja, jeg har også oprettet data). Så har jeg prøvet at udføre jeres forespørgsler via PHPMyAdmin.
Din, morhan, giver godt nok alle records i 'navne' men alle by-felterne har bare NULL.
Din, hmortensen giver intet resultat i PHPMyAdmin. Den vender bare tilbage til samme forespørgselsskærm. Hvad det lige betyder ved jeg ikke. Jeg gætter på at den ikke finder de eksisterende records (intet resultat).
Har I en forklaring? :/
Avatar billede morhan Novice
14. april 2006 - 23:38 #5
hvis der ikke findes en tilhørende by_postnr til navn_by, så vil left join returnere null, og inner join vil helt springe posten over
Avatar billede hmortensen Nybegynder
14. april 2006 - 23:46 #6
Prøv at smide et dump af din struktur + data (hvis det er noget data vi må se).
Avatar billede jeffe Nybegynder
15. april 2006 - 08:26 #7
De virker begge to. Det er bnare mig der ikke er vågen :)
Jeg havde oprettet records i 'navne' med id's til byerne (1,2,3,4 osv.) men havde lavet byerne med uikke postnure, dvs. uden et egentligt id.
Det virker!!
Smid svar for at dele point (går ud fra det er ok).
Og tusind tak for hjælpen. Anede ikke lige at man kunne inddrage samme tabel flere gange på den måde, bare man lavede aliasser.
Avatar billede hmortensen Nybegynder
15. april 2006 - 13:11 #8
Godt du fik det til at virke :)
Avatar billede jeffe Nybegynder
15. april 2006 - 15:23 #9
Jeg har lige et sidste spørgsmål. Jeg kan snildt få det til at funke med byerne, men mine egentlige tabeller var jo lidt anderledes, men i bund og grund samme princip....

Jeg har fået det rigtige frem, men forskellen er, at pendanten til by-tabellen har flere felter, og jeg skal altså trække mere end ét felt ud fra hver. Derfor kan hver JOIN ikke  bare aliasses til 'by1', 'by2', 'by3'. Hvordan gør jeg så? Altså, hvis jeg skal hente flere data om hver by (men ellers som før)....
Avatar billede jeffe Nybegynder
16. april 2006 - 22:59 #10
Efter at have kigget lidt på det, tror jeg faktisk slet ikke jeg kan bruge det i nuværende stand. Alle felter hedder det samme. Jeg får bare tre felter med samme navn ud (se ovenstående indlæg).
Avatar billede jeffe Nybegynder
18. april 2006 - 12:33 #11
I orden I ikke skriver mere. Jeg har jo i princippet også fået et fint nok svar. Det var bare ikke helt brugbart i mit tilfælde, men jeg bikser lidt videre med det selv...
Avatar billede hmortensen Nybegynder
18. april 2006 - 13:14 #12
Havde ikke set du havde skrevet ;)

Jeg er ikke helt med på hvordan du mener. Kan du ikke prøve at vise mere hvordan dit system er opbygget, og hvad du vil ha ud.
Avatar billede jeffe Nybegynder
18. april 2006 - 14:09 #13
Jo, altså. Det er noget gejl til at lave nogle typografier, som jeg så kan putte på mine sider, så det hele ikke skal angives mange gange (skal være til at ændre, derfor benytter jeg ikke bare en ekstern CSS-fil).

Jeg har en slags opsætningstabel med forskellige data samt tre felter, der fortæller hvilke tre typografier der skal benyttes til henholdvis overskrift, tekst og forfatter.

Så uden alt det overflødige:

OPSÆTNINGSTABEL:

overskrift_typografi (int)
tekst__typografi (int)
forfatter__typografi (int)


TYPOGRAFITABEL

typografier_id (int)
typografier_skrifttype (varchar)
typografier_farve (varchar)
typografier_stoerrelse (int)
typografier_fed (int)
typografier_kursiv (int)
typografier_understreg (int)

Jeg vil hente alt fra opsætningstabellen og for overskrift_typografi og de to andre skal der hentes de seks felter der matcher id. Håber det giver mening.
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