Avatar billede pollas Nybegynder
13. august 2001 - 17:17 Der er 9 kommentarer og
1 løsning

SQL-spørgsmål

Jeg har en lille tabel med hhv. id og navn, der bruges til at liste forskellige navne for sig. I en anden tabel har jeg diverse felter, og et felt indeholdende id\'er fra den nævnte navne-tabel kommasepareret.

Pointen er altså på den ene side at vise navnene, på den anden at inkludere disse navne i en sammenhæng med anden data.

Jeg har puttet navnene fra den første tabel i en dropdown, der med id som value kalder en side, der skal trække nogle bestemte poster ud af den store tabel baseret på navnene.

FX:
1, Anders
2, Brian
3, Christian
4, Dan

Posterne i tabel2 er så bygget op med diverse data samt et felt indeholdende fx. 1,3,4 - svarende til Anders, Christian, Dan - håber jeg...

1. Er det den smartestte måde overhovedet?
2. Hvis ja, hvordan laver jeg så sql-kaldet til udtræk i tabel2 - det burde være noget a la: SELECT * FROM tabel2 WHERE (id\'et fra dropdown findes i navne-feltet)

Er bange for det er en smule uforståeligt, men jeg er også lidt tåget :)

Håber nogen kan hjælpe.
Avatar billede tmceu Praktikant
13. august 2001 - 17:32 #1
Det er næsten som du har skrevet

Eks. SELECT * FROM tabel2 WHERE [Id] = 1

Hvis du vil vise data fra begge tabeller på én gang, kan du skrive SELECT * FROM Tabel1 INNER JOIN Tabel2 on Tabel1.Id = Tabel2.Id where Id=1

Håber jeg har forstået spørgsmålet korrekt.
Avatar billede tmceu Praktikant
13. august 2001 - 17:33 #2
Undskyld, en lille fejl:

Hvis du vil vise data fra begge tabeller på én gang, kan du skrive SELECT * FROM Tabel1 INNER JOIN Tabel2 on Tabel1.Id = Tabel2.Id where Tabel1.Id=1
Avatar billede burningice Nybegynder
13. august 2001 - 17:33 #3
uhm... umiddelbart lyder det da som en ok idé

og sådan som jeg har forstået kan du sagtens lave en sql query som du har vist

på side1 (den med dropdownbox\'en) sørger du for at form action er ligmed side2.asp og method er post

altså, form action=\"side2.asp\" method=\"post\"

kode på side2.asp:

<%
id = request.form(\"id\")

set rs = conn.execute(\"Select * from tabel2 where (id = \"& id &\")\")

do until rs.eof
\'skriv
rs.movenext
loop
%>
Avatar billede nuno Nybegynder
13. august 2001 - 17:34 #4
normalt vil man normalisere tabellerne således, at hver gang du har et id i tabel2, som også forekommer i tabel1 - så vil der komme en ny post

fx

hvis du i tabel 1 har (som du skriver)

1  Anders
2  Brian
3  Christian
4  Dan

så får du en tabel der ser således ud

1  Bil    1
2  Bil    2
3  Bil    3


hvis du før havde det som

1  Bil  1,2,3

(Bil er bare et eksempel)

altså - hvis BÅDE Anders, Brian og Christian er knyttet til en Bil - så giver det 3 poster i Tabel2

dette er den korrekte måde at gøre det på - og tabellen er nu forholdsvis nem at opdatere - prøv at tænke lidt på den kode du skal bruge for at administrere (rette, slette eller tilføje) i eet felt i stedet for i 3 records - så skal du bruge både strengemanipulering og sql - på den måde jeg har forklaret kan du nøjes med ren sql til at redigere i dine data i tabellen

/nuno
Avatar billede pollas Nybegynder
13. august 2001 - 22:42 #5
tmceu, cyberfessor>> giver jeres løsning ikke blot muligheden for at vælge een bestemt post vha. id?

nuno>> er ikke helt sikker på jeg forstår (er lidt forvirret) - tror måske det er bagvendt...

Jeg har navnene (med unikke di\'s) i een tabel, og nogle kategorier i en anden, fx. spejder, studerende, kok mv. (dårlige eksempler, men dog eksempler :)

Ideen er så, at jeg i sidstnævnte vil have fx id=1, kategori=spejder, personer=1,2,4 svarende til personer i førstnævnte tabel, der jo altså kn optræde i flere kategorier.

Vil det være smartere at gøre det omvendt, eller kan man vælge direkte vha. sql \"vælg fra navnetabellen alle de navne hvis id optræder i navnefeltet i en bestemt kategori i kategori-tabellen\"?

Altså, jeg vælger spejder - og får vha. navnefeltet i denne kategori listet navnene svarende til id 1,2 og 4...

Håber det er bare lidt mere klart :)
Avatar billede tmceu Praktikant
14. august 2001 - 00:46 #6
Jo og det var egentlig det jeg troede du ville; vælge et id i en dropdown og så hente data med denne id som key.

Men hvis jeg forstår din seneste kommentar, er det noget med at du vil gemme information om id på eks. alle spejdere i ét felt i kategori tabellen, er det korrekt ?

Hvis det er tilfældet, tror jeg du er på vej ud i noget snavs. Man kan selvfølgelig godt strikke noget sammen eks. med if id in(personer), men det bliver noget rod efter min mening. Ikke mindst fremadrettet i.f.t. vedligeholdelse, når du har mange personer i en kategori o.s.v..

Kig lidt mere på nuno\'s eksempel...
Avatar billede nuno Nybegynder
14. august 2001 - 09:22 #7
pollas ok - den rigtige måde at designe sådan en database på - er så at lave en 3 tabel - som laver en relation mellem dine navne og dine kategorier.

Din database bør se således ud

TabelMedNavne:
id    navn
1      Anders
2      Brian
3      Christian
4      Dan

TabelMedKategorier:
id    kategori
1      spejder
2      studerende
3      kok

hvis nu så vi fx antager følgende:

Anders er spejder og studerende
Brian er kok
Christian er kok og spejder
Dan er studerende

så vil din relationstabel se således ud:

TabelMedRelationer:
navneid    kategoriid
1          1                -> fordi Anders er spejder
1          2                -> fordi Anders også er studerende
2          3                -> fordi Brian er kok
3          1                -> fordi Christian er spejder
3          3                -> fordi Christian også er kok
4          2                -> fordi Dan er studerende



hvis nu du vælger et id ud fra en selectbox med kategorier på din side - og laver et sql udtræk - så vil det se således ud:

\"SELECT TabelMedNavne.id, TabelMedNavne.navn, TabelMedKategorier.id FROM ((TabelMedRelationer INNER JOIN TabelMedNavne ON TabelMedRelationer.navneid = TabelMedNavne.id) INNER JOIN TabelMedKategorier ON TabelMedRelationer.kategoriid = TabelMedKategorier.id) WHERE TabelMedKategorier.id = \" &  request.form(\"DitFormFeltMedKategoriID\")

dette vil udtrække id og navne på de personer som er knyttet til en kategori svarende til det id du får ind fra selectboxen - vha. request.form

[kommentar: det er derfor, at en sådan database hedder en relationel database - eller relations database - fordi der er 2 tabeller, og den 3 tabel opretter relationer mellem records i disse tabeller vha. såkaldte fremmednøgler (i dette tilfælde: navneid og kategoriid er fremmednøgler til hvert sit id i de 2 første tabeller)]


/nuno
Avatar billede pollas Nybegynder
14. august 2001 - 09:45 #8
nuno>> Tak for kommentaren :) det luredde mig, he he...

Jeg havde godt forestillet mig at man skulle ud i noget junction-table-hlløj, men kunne det undgås med lidt fiksfakserier (opdateringsbehovet er ikke så stort), så havde det jo været fikst...

Mange tak!
Avatar billede pollas Nybegynder
14. august 2001 - 13:16 #9
Hmm, jeg har nu lavet et eksempel med udgangspunkt i tv-kanaler og disses typer (sport, film osv.)

Basen ser således ud:

kanaler:
id - kanal - logo
1 - tvdk - tvdklogo.gif
2 - tv3+ - 3logo.gif

kanaltyper:
id - type
1 - sport
2 - film
3 - musik

kanalerogtyper: (samling af sagerne)
kanaltypeid - kanalid
1 - 2
2 -3
osv

Behovet er, at trække bestemte kanaler ud baseret på et genre(type)valg, fx. sport (1) skal hive alle poster fra kanaler, hvis id er at finde i kanalerogtyper sammen med sports-id\'et.

Dette er min sql, der dog melder fejl:

sql = \"SELECT kanaler.id, kanaler.kanal, kanaler.logo FROM ((kanalerogtyper INNER JOIN kanaltyper ON kanalerogtyper.kanaltypeid = kanaltyper.id) INNER JOIN kanalerogtyper ON kanalerogtyper.kanalid = kanaler.id) WHERE kanalerogtyper.kanaltypeid = \" & genre

genre er en request på et id

Hvad gør jeg galt?
Avatar billede pollas Nybegynder
14. august 2001 - 13:33 #10
Oh, nevermind - min fejl - forkert mySQL-version... (jeg ønsker mig 3.23 til jul...)
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
Kurser inden for grundlæggende programmering

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