13. august 2001 - 17:17Der 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 :)
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
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...
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..
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>> 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...
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
Oh, nevermind - min fejl - forkert mySQL-version... (jeg ønsker mig 3.23 til jul...)
Synes godt om
Ny brugerNybegynder
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.