Avatar billede Lars Søndergaard Nybegynder
31. oktober 2005 - 10:18 Der er 23 kommentarer og
1 løsning

Hjælp til query

Jeg har to tabeller.. en tabel med Studenter og en tabel med lande.

Studenter kan have flere lande tilknyttet.. de har land1, land2, land3, land4 og land5. Hvordan kan jeg i en select fange alle lande. Jeg har selv følgende query som fanger et land fra lande tabellen:

SELECT TOP 1 [country_name], person.* FROM [TBL_Student] person INNER JOIN [tbl_country] country ON country.country_id = person.country_id
Avatar billede erikjacobsen Ekspert
31. oktober 2005 - 10:23 #1
Du skal ikke have felter, land1, land2, osv. Men du skal have en tabel mere, der binder student med land

  student_id  |  land_id
    1        |      3
    1        |      4
    2        |      1
Avatar billede Slettet bruger
31. oktober 2005 - 10:23 #2
Fjern top 1 ??
Avatar billede arne_v Ekspert
31. oktober 2005 - 10:26 #3
SELECT person.id,person.name,country.name FROM [TBL_Student] person INNER JOIN [tbl_country] country ON country.country_id = person.country_id ORDER BY person.id

måske
Avatar billede Lars Søndergaard Nybegynder
31. oktober 2005 - 11:33 #4
jeg er ikke helt sikker på hvad der er smartest, men jeg kan ikke se at jeg behøver flere tabeller. Jeg har to tabeller nu. En student har FAST 5 lande tilknyttet:

land_id_1, land_id_2, land_id_3, land_id_4, land_id_5

Jeg har en lande tabel:

land_id | land_navn
  1    | Tyskalnd
  2    | Danmark
  3    | England
  4    | Italien

Jeg skal lave en SELECT i forbindese med en advanced search hvor brugeren har søgt på feks. tyskland og england.
Avatar billede arne_v Ekspert
31. oktober 2005 - 11:36 #5
så har Erik ret - du skal have ændret din tabel struktur
Avatar billede Lars Søndergaard Nybegynder
31. oktober 2005 - 11:49 #6
arne > det må du overbevise mig om.. hvis jeg ændrer min tabel struktur får en student jo bare endnu et id i stedet for en landenavn ?

min tabelstruktur er følgende:

tbl_student:
-----------------------------------------------
id | navn | adresse | land_1 | land_2 | land_3|
1  | Ole  | Vej 11  |  3    |  2    |  4  |


tbl_country

land_id | land_navn
  1    | Tyskalnd
  2    | Danmark
  3    | England
  4    | Italien

Hvad skulle det hjælpe med flere tabeller her ?

Jeg skal bare have en SELECT hvor alle lande id'er oversættes til lande navne ??
Avatar billede erikjacobsen Ekspert
31. oktober 2005 - 12:10 #7
tbl_student:
-----------------------------------------------
id | navn | adresse |
1  | Ole  | Vej 11  |

stud_country:
------------
stud_id | country_id
1  |    3
1  |    2
1  |    4

tbl_country

land_id | land_navn
  1    | Tyskalnd
  2    | Danmark
  3    | England
  4    | Italien

En studerende får ikke en ny id. Men den opdeling kan du få det svar med een sql-forespørgsel.
Avatar billede Lars Søndergaard Nybegynder
31. oktober 2005 - 12:41 #8
jeg er ked af at jeg ikke kan se meningen med det... hvordan kan jeg få mine informationer med blot een sql query på denne måde ?
Avatar billede erikjacobsen Ekspert
31. oktober 2005 - 12:51 #9
Du skal lige fortælle hvad du skal have ud.
Avatar billede Slettet bruger
31. oktober 2005 - 12:53 #10
Det kan du heller ikke, men det er den "korrekte" måde at modellerer det på, hvilket du selvfølgeligt ikke umiddelbart kan bruge noget noget som det står nu.

Du kan prøve følgende, jeg kan kun advarer mod at bruge det, men her er en mulighed (ved ikke om den fungerer i MS SQL med giv det et forsøg:

select id, navn, adresse, (select land_navn from tbl_country where land_id = land_1) as land1_text, ..... from tbl_student where ....
Avatar billede Lars Søndergaard Nybegynder
31. oktober 2005 - 12:54 #11
Jeg skal lave en SELECT i forbindese med en advanced search hvor brugeren har søgt i en student på feks. land_1 = england og land_2 = tyskland

Jeg skal liste alle studenter som har opfyld dette søgekriterie
Avatar billede Slettet bruger
31. oktober 2005 - 13:01 #12
Et opklarende spørgsmål er der nogen form for prioritet eller på anden måde rækkefølge i relation til de lande der er tilknyttet en studerende ?
Avatar billede erikjacobsen Ekspert
31. oktober 2005 - 13:02 #13
Hvad mener du de skal søge på? en studerende som er tilknyttet både england og tyskland?
en studerende som er tilknyettet england eller tyskland? En studerende som har england som 1. land, og tyskland som 2. land. Vi kan kun gætte, hvis du ikke præcist forklarer hvad det skal være.
Avatar billede Lars Søndergaard Nybegynder
31. oktober 2005 - 14:17 #14
nej nej der er ingen prioritet eller rækkefølge. det er meget simpelt. jeg skal bare udtrække alle studenter af databasen som har FEKS. SELECT * FROM [TBL_Student] WHERE [land_1] = 'england' AND [land_2] = 'tyskland'
Avatar billede Slettet bruger
31. oktober 2005 - 14:46 #15
Er det muligt for dig at have landene som id eller bliver de indtastet som tekst i forbindelse med søgningen ?
Avatar billede erikjacobsen Ekspert
31. oktober 2005 - 14:59 #16
Ok, hvis jeg har forstået dig korrekt, så må det blive sådan ca. (tabelle som i 31/10-2005 12:10:13)

select navn from tbl_student,stud_country
where tbl_student.id=stud_country.stud_id
  and stud_country.country_id > all
      (select land_id from tbl_country where land_navn in ('England','Tyskland'))
Avatar billede Lars Søndergaard Nybegynder
31. oktober 2005 - 16:10 #17
kryptos> de indtastes som landenavne i forbindelse med søgning men har som sagt et id i databasen.

erik> jeg fatter bare ikke at jeg er nødt til at have den 3. database.. kan man ikke lave noget nested select:

SELECT * FROM [TBL_Student] WHERE [land_1] = (SELECT land_navn from tbl_country  where land_id = 2) AND [land_2] = (SELECT land_navn from tbl_country where land_id = 4)

eller noget endnu smartere.. jeg kan ikke overskue at skulle lave en ekstra tabel.. :D så er det nedern at være programmør
Avatar billede Lars Søndergaard Nybegynder
31. oktober 2005 - 16:11 #18
3. database = 3. tabel, my bad
Avatar billede erikjacobsen Ekspert
31. oktober 2005 - 17:22 #19
Det er sjovt at være programmør, hvis man gør det rigtigt ;)

Nej, det er uholdbart, det du prøver på. Syn's jeg. Tag et kursus i database-teori en gang.

Tænk på at "England" kan stå både i land_1, land_2, land_3, land_4 og i land_5, og tilsvarende med "Tyskland" (eller koderne for dem). Hvis du siger, at det er ligegyldigt hvor de står, så får du en megastor sql-sætning. Og en helt anden sql-sætning hvis der skal søges på 3 navne. Du får ikke mig til at bøvle med det ;)

Et alternativ er at læse det hele ind med det bagvedliggende programmeringssprog, og så klare det dér. Det er i hvert fald OK, hvis der ikke er alt for mange data.
Avatar billede Slettet bruger
31. oktober 2005 - 17:39 #20
Gør hvad Erik har forslået det er det eneste der holder i længden, når der ikke er rækkefølge eller andre regler der kan forsvarer at de skal "sidde" direkte på den studerende.
Avatar billede Lars Søndergaard Nybegynder
31. oktober 2005 - 18:02 #21
jeg tror i misforstår.. det er kun i søgningen at rækkefølge som udgangspunkt er ligegyldig.. fordi jeg godt selv kan sortere mine datatables mv. De fem lande som en student har er ikke tilfældige.

land_1 : hjem_land
land_2 : udrejse_land
land_3 : udrejse_1_prioritet
land_4 : udrejse_2_prioritet
land_5 : udrejse_3_prioritet

så jeg kan ikke bare lave en relationstabel
Avatar billede erikjacobsen Ekspert
31. oktober 2005 - 18:25 #22
Ok, jeg giver op. Det har taget næsten 8 timer før spørgeren (måske) nærmer sig at stille spørgsmålet nogenlunde præcist. Jeg har ikke tålomodighed til mere.
Avatar billede Lars Søndergaard Nybegynder
31. oktober 2005 - 19:53 #23
erikj > jeg er ked af hvis jeg har spildt din/jeres tid, men jeg har oponeret imod en ekstra tabel lige fra starten. hvis jeg ikke spørger ordentlig er det for jeg ikke er så stærk i sql. Jeg har lavet en midlertidig løsning hvor jeg tager mig af det hele i koden med at oversætte lande id'er til lande navne. Ikke den løsning jeg ønskede men det bedste jeg kunne komme op med inden for rimelig tid.
Avatar billede Lars Søndergaard Nybegynder
11. januar 2006 - 20:45 #24
bedste løsning var at lave et view og selecte derfra.. man skal sikre sig at man har forstået spørgsmålet. det er svært at spørge ordentlig når man ikke ved noget om det man spørger om :D
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