Avatar billede simme Nybegynder
24. september 2003 - 00:16 Der er 23 kommentarer

Select * FROM Medlemmer WHERE klasse in (5,7,11) fejler -hvorfor?

Jeg har et felt i databasen som hedder [klasse] dette felt indeholder fx. 5,11,17 (streng) - disse værdier kommer fra en andet tabel med felterne [klasseID] og [klassenavn] der fx. kunne indeholde hhv. 5 og leder.

Jeg ønsker at udvælge alle de records hvor der i feltet klasse står skrevet 5 eller 7 eller 11.

Jeg har prøvet med følgende:

SQL =" Select * From medlemmer WHERE klasse in (5,7,11) "

men dette resulterer i en fejl:
Datatyperne stemmer ikke overens i kriterieudtrykket.

hvordan skal jeg lave min SQL forespørgsel??
Avatar billede d4s Novice
24. september 2003 - 00:21 #1
SQL =" Select * From medlemmer WHERE klasse = '5,7,11' "

eller hvis feltet også indeholder andre værdier:
SQL =" Select * From medlemmer WHERE klasse like '%5,7,11%' "

Metoden duer bare ikke, hvis feltet kan indeholde 5,7,9,11. Der skal du bruge en anden opbygning af din DB.

D4
Avatar billede simme Nybegynder
24. september 2003 - 00:27 #2
feltet klasse kan indeholde en masse forskelligt, fx. [5] eller [4,22] eller [6,11,22] mm.

Jeg ønsker så alle de records hvor der i feltet står 5 eller 7 eller 11
Avatar billede tjp Mester
24. september 2003 - 00:27 #3
Tallene skal være strenge, altså ikke 5 men '5':
SQL =" Select * From medlemmer WHERE klasse in ('5','7','11') "
Avatar billede d4s Novice
24. september 2003 - 00:29 #4
ups. Jeg læste ikke spørgsmålet ordentligt.
Avatar billede tjp Mester
24. september 2003 - 00:35 #5
Sorry, samme her - det er nok nærmere dette:

SQL =" Select * From medlemmer
WHERE klasse LIKE '%5%'
OR klasse LIKE '%7%'
OR klasse LIKE '%11%' "
Avatar billede simme Nybegynder
24. september 2003 - 00:46 #6
TIL tjp
Det er næsten korrekt: Jeg får dog kun de records, hvor feltet [klasse] indeholder et tal fx. 7 - men hvis det indeholder 7,11 bliver recorden ikke udskevet.
Avatar billede d4s Novice
24. september 2003 - 01:00 #7
Det burde virke. Prøv at smide din SQL sætning her. Det kan jo være at du har glemt et tegn.
Avatar billede tjp Mester
24. september 2003 - 01:01 #8
Mener du ét tal ialt, eller opstår problemet, når feltet rummer flere af de ønskede tal?
Avatar billede simme Nybegynder
24. september 2003 - 01:07 #9
Ex. på fem records:
1: [Nr];[Navn];[Klasse] = 10; Bent; 8;
2: [Nr];[Navn];[Klasse] = 12; Hans; 8,22
3: [Nr];[Navn];[Klasse] = 15; Lotte; 8,11,22
4: [Nr];[Navn];[Klasse] = 33; Jens; 2
5: [Nr];[Navn];[Klasse] = 54; Britta; 22

Nu vil jeg gerne udvælge alle de records med tallet 8 eller 22 i feltet [Klasse]

Hvis jeg bruger: SQL =" Select * From medlemmer WHERE klasse in ('8','22') "
får jeg kun record 1 og 5 - hvordan får jeg de reccord 2 og 3 med også??
Avatar billede tjp Mester
24. september 2003 - 01:07 #10
Egentlig burde problemet være at du fik for mange poster, da den vist også fanger fx 17 og 211, såvidt jeg kan se.
Så kommaerne bør nok inkluderes i LIKE sætningerne.
Avatar billede tjp Mester
24. september 2003 - 01:11 #11
Hvorfor har du ikke en række for hver Klasse-deltagelse?
Hov du bruger jo LIKE!
Avatar billede d4s Novice
24. september 2003 - 01:12 #12
Du bruger jo ikke tjps sidste løsning med LIKE:

SQL =" Select * From medlemmer
WHERE klasse LIKE '%8%'
OR klasse LIKE '%22%' "

Problemet er som tjp skriver at du også får poster med f.eks. tallet 18 og 83, fordi de indeholder tallet 8. Da du nogen gange bruger komma og andre gange semikolon, kan man ikke medtage kommaet i LIKE sætningen.

Hilsen
D4
Avatar billede tjp Mester
24. september 2003 - 01:12 #13
Jeg mente selvfølgelig:
Hov du bruger jo ikke LIKE!
Avatar billede simme Nybegynder
24. september 2003 - 01:17 #14
Nej - jeg har desværre skrevet min kommentar (00:46:03) samtidig med at der er blevet svaret fra tjp (00:35:40)

Men det er korret at jeg får for mange når jeg bruger LIKE
Men jeg bruger ikke semikolon i feltet [Klasse] KUN komma!
Avatar billede d4s Novice
24. september 2003 - 01:19 #15
1: [Nr];[Navn];[Klasse] = 10; Bent; 8;
Det sidste tegn er semikolon og jeg gik ud fra at det var gemt i DBen med semikolon. sorry.
Avatar billede simme Nybegynder
24. september 2003 - 01:19 #16
Hvis jeg skal bruge LIKE kan jeg ikke have værdier fra 0-9 da disse så også forekommer med 11, 22, 21 mfl.

Så måske jeg er nød til at lave min tabel med klasseID om så den starter ved 10 og kører opefter derfra? så kan jeg da bruge LIKE kommandoen men der er lidt meget LIKE kode der skal til...
Avatar billede simme Nybegynder
24. september 2003 - 01:20 #17
Det var vist en tyrkfejl ;-)
Avatar billede d4s Novice
24. september 2003 - 01:24 #18
Jeg foreslår at du laver din DB struktur om, så klasse kun indeholder et tal. Du skal så have en post for hvert tal, så du kan søge med:

SELECT *
FROM medlemmer
WHERE klasse IN (8,22)

evt. kan du oprette en ny tabel, som ikke indeholder navnet. Du får så:

elevtabel:  nr & navn
klassetabel: nr & klasse

så kan du joine tabellerne i din søgning.
Avatar billede tjp Mester
24. september 2003 - 01:29 #19
Som sagt, kunne du overveje at have én række for hver gang en person deltager i en klasse - det regnes af nogle for god DB skik ;-)

Ved at foranstille et 0, undgår du at droppe 0-9, altså 00-09, men du løber ind i problemet igen hvis du runder 100! *S*
Avatar billede tjp Mester
24. september 2003 - 01:30 #20
Nå, det var du også inde på d4! *S*
Avatar billede simme Nybegynder
24. september 2003 - 01:55 #21
Jeg er ikke helt klar over om jeg forstår jer. Men jeg har PT to tabeller

medlemtabel: medlnr(int); navn(str); klasse(str)
klassetabel: klasseID(int); klassenavn(str)

Via en "multi-valgbox" udvælges klasserne (en til flere klasser). multi-valgboxen er fyldt med data fra klassetabelen. Når klasserne er valgt bliver klasseIDerne (fx. 8,12,22) skrevet i feltet klasse i medlemtabellen.

Er denne databaselogik forkert bygget op ifølge det i skriver?
Avatar billede tjp Mester
24. september 2003 - 04:36 #22
Du kunne evt. lave en "Går_i"-tabel: medlnr(int),klasseID(int) af lutter fremmednøgler, hvor der for alle medlemmer, er en række for hver eneste klasse som han/hun går i, dvs. et medlnr gentages i ny række for hvert klasseID. Skulle personen springe fra en klasse sletter man bare en post fremfor at skulle ind at rette i en str.

Det virker lidt som at skyde gråspurve med krydsermissiler, men allerede ved blot lidt større DBer gør det livet meget nemmere, når den skal vedligeholdes.
Avatar billede d4s Novice
24. september 2003 - 08:46 #23
Der findes en forklaring om relationsdatabaser her:
http://activedeveloper.dk/aspdigital/2002050201.asp

Hilsen
D4
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