|
| Hvordan gøres dette smartest... Fra : Magnus |
Dato : 05-02-03 14:33 |
|
Jeg har i en MySQL tabel et felt som hedder "malscore" her står fx.
"69,48,79,169" som er id-nr på spillerne som har scoret.
Når jeg udskriver målscorerne bruger jeg funktionen split(malscore,",") til
at adskille de forskellige målscorer.
Men kan jeg ikke gøre det direkte i MySQL så ikke jeg skal gennemløbe alle
poster.
Hvad MySQL sætning kan jeg bruge til at få hentet de poster hvor feltet
"malscore" indeholder spillerens id-nr. Fx. 69 og uden at poster som fx 169,
269, 690 eller lignende tal kommer med?
SQL=....WHERE malscore="69" ???
/Magnus
| |
Jimmy (05-02-2003)
| Kommentar Fra : Jimmy |
Dato : 05-02-03 14:50 |
|
"Magnus" <arnason@email.dk> wrote in message
news:b1r3r8$3tr$1@news.cybercity.dk...
> Jeg har i en MySQL tabel et felt som hedder "malscore" her står fx.
> "69,48,79,169" som er id-nr på spillerne som har scoret.
>
> Når jeg udskriver målscorerne bruger jeg funktionen split(malscore,",")
til
> at adskille de forskellige målscorer.
Det er fundamentalt forkert databasedesign, der er skyld i, at du oplever
problemer nu.
En mere korrekt måde at gøre det på er følgende:
kamp
----
ID
Dato
....
spiller
-------
ID
Navn
maal
----
ID
Kamp_ID
Spiller_ID
Tabellen "spiller" populeres med samtlige spillere.
Der oprettes en indgang i tabellen "kamp" for hver kamp der spilles.
For hvert mål en spiller scorer oprettes en indgang i tabellen "maal" med et
Kamp_ID, der refererer til den specifikke kamp og et Spiller_ID, der
refererer til den specifikke spiller.
Nu kan du trække alle de maalscorende spillere ud for hver kamp, for alle
kampe, osv osv.
Jeg er med på det kræver en del omprogrammering fra din side og det ikke var
det svar du ønskede, men du vil helt sikkert opleve mange flere
begrænsninger med dit nuværende "design".
Mvh
Jimmy
| |
Jakob Andersen (05-02-2003)
| Kommentar Fra : Jakob Andersen |
Dato : 05-02-03 16:12 |
|
"Magnus" <arnason@email.dk> wrote
> Jeg har i en MySQL tabel et felt som hedder "malscore" her står fx.
> "69,48,79,169" som er id-nr på spillerne som har scoret.
Som Jimmy ganske rigtigt siger så er det et ret uhensigsmæssigt(mht.
normalisering) databasedesign. Derfor vil min anbefaling klart være at følge
hans råd.
Det du fisker efter er et slags "liste" i din database, hvilket også er
muligt men kræver at alle værdier der kan være i listen er specificeret i
tabeldefinitionen, dette gøres ved datatypen SET.
< http://www.mysql.com/doc/en/SET.html>
og som du nok kan se er det ikke så smart til din løsning.
> Hvad MySQL sætning kan jeg bruge til at få hentet de poster hvor feltet
> "malscore" indeholder spillerens id-nr. Fx. 69 og uden at poster som fx
169,
> 269, 690 eller lignende tal kommer med?
>
> SQL=....WHERE malscore="69" ???
Dette kunne løses ved at lave listen på formen
,<værdi>,<værdi>,<værdi>,<værdi>,
og søge på
WHERE malscore LIKE '%,<værdi>,%'
--
Jakob Andersen
| |
Klaus Ambrass (06-02-2003)
| Kommentar Fra : Klaus Ambrass |
Dato : 06-02-03 13:50 |
|
"Magnus" <arnason@email.dk> wrote in news:b1r3r8$3tr$1@news.cybercity.dk:
> Jeg har i en MySQL tabel et felt som hedder "malscore" her står fx.
> "69,48,79,169" som er id-nr på spillerne som har scoret.
>
> Når jeg udskriver målscorerne bruger jeg funktionen split(malscore,",")
> til at adskille de forskellige målscorer.
>
> Men kan jeg ikke gøre det direkte i MySQL så ikke jeg skal gennemløbe
> alle poster.
>
> Hvad MySQL sætning kan jeg bruge til at få hentet de poster hvor feltet
> "malscore" indeholder spillerens id-nr. Fx. 69 og uden at poster som fx
> 169, 269, 690 eller lignende tal kommer med?
>
> SQL=....WHERE malscore="69" ???
>
> /Magnus
>
Prøv med:
findID = "69"
minStreng = "12,34,69,70,800"
i = InStr(minStreng, findID)
If i Then
ID = Mid(minStreng, i, Len(findID))
Me.TextBox1.Text = ID
End If
--
Klaus Ambrass
IT - Storstrøms Amt
kam@it.stam.dk
| |
Jimmy (06-02-2003)
| Kommentar Fra : Jimmy |
Dato : 06-02-03 14:12 |
|
"Klaus Ambrass" <kam@it.stam.dk> wrote in message
news:Xns931A8C3CDCB3Dambrass@212.88.64.226...
> "Magnus" <arnason@email.dk> wrote in news:b1r3r8$3tr$1@news.cybercity.dk:
>
> > Jeg har i en MySQL tabel et felt som hedder "malscore" her står fx.
> > "69,48,79,169" som er id-nr på spillerne som har scoret.
> >
> > Når jeg udskriver målscorerne bruger jeg funktionen split(malscore,",")
> > til at adskille de forskellige målscorer.
> >
> > Men kan jeg ikke gøre det direkte i MySQL så ikke jeg skal gennemløbe
> > alle poster.
> >
> > Hvad MySQL sætning kan jeg bruge til at få hentet de poster hvor feltet
> > "malscore" indeholder spillerens id-nr. Fx. 69 og uden at poster som fx
> > 169, 269, 690 eller lignende tal kommer med?
> >
> > SQL=....WHERE malscore="69" ???
> >
> > /Magnus
> >
>
>
> Prøv med:
>
> findID = "69"
> minStreng = "12,34,69,70,800"
> i = InStr(minStreng, findID)
> If i Then
> ID = Mid(minStreng, i, Len(findID))
> Me.TextBox1.Text = ID
> End If
Hvordan håndterer din kode en minStreng = "12,34,6969,69,1169,70,800" ?
Jeg tror Magnus søgte en SQL-streng og ikke kode-eksempel.
Jakob gav et eksempel, som ville virke fint med det nuværende setup.
Mvh
Jimmy
| |
Klaus Ambrass (10-02-2003)
| Kommentar Fra : Klaus Ambrass |
Dato : 10-02-03 10:33 |
|
"Jimmy" <nyhedsgruppe@get3_erstat_3_med_2_net.dk> wrote in
news:V9t0a.47$GC7.12@news.get2net.dk:
>
> "Klaus Ambrass" <kam@it.stam.dk> wrote in message
> news:Xns931A8C3CDCB3Dambrass@212.88.64.226...
>> "Magnus" <arnason@email.dk> wrote in
>> news:b1r3r8$3tr$1@news.cybercity.dk:
>>
>> > Jeg har i en MySQL tabel et felt som hedder "malscore" her står fx.
>> > "69,48,79,169" som er id-nr på spillerne som har scoret.
>> >
>> > Når jeg udskriver målscorerne bruger jeg funktionen
>> > split(malscore,",") til at adskille de forskellige målscorer.
>> >
>> > Men kan jeg ikke gøre det direkte i MySQL så ikke jeg skal
>> > gennemløbe alle poster.
>> >
>> > Hvad MySQL sætning kan jeg bruge til at få hentet de poster hvor
>> > feltet "malscore" indeholder spillerens id-nr. Fx. 69 og uden at
>> > poster som fx 169, 269, 690 eller lignende tal kommer med?
>> >
>> > SQL=....WHERE malscore="69" ???
>> >
>> > /Magnus
>> >
>>
>>
>> Prøv med:
>>
>> findID = "69"
>> minStreng = "12,34,69,70,800"
>> i = InStr(minStreng, findID)
>> If i Then
>> ID = Mid(minStreng, i, Len(findID))
>> Me.TextBox1.Text = ID
>> End If
>
> Hvordan håndterer din kode en minStreng = "12,34,6969,69,1169,70,800" ?
>
> Jeg tror Magnus søgte en SQL-streng og ikke kode-eksempel.
> Jakob gav et eksempel, som ville virke fint med det nuværende setup.
>
> Mvh
> Jimmy
>
>
>
Hvis du sætter findID="69," så er der ingen problemer, ellers finder den
bare den første "69" der passer - altså "6969" i din streng.
--
Klaus Ambrass
IT - Storstrøms Amt
kam@it.stam.dk
| |
Jimmy (10-02-2003)
| Kommentar Fra : Jimmy |
Dato : 10-02-03 11:48 |
|
> >>
> >> Prøv med:
> >>
> >> findID = "69"
> >> minStreng = "12,34,69,70,800"
> >> i = InStr(minStreng, findID)
> >> If i Then
> >> ID = Mid(minStreng, i, Len(findID))
> >> Me.TextBox1.Text = ID
> >> End If
> >
> > Hvordan håndterer din kode en minStreng = "12,34,6969,69,1169,70,800" ?
> >
> > Jeg tror Magnus søgte en SQL-streng og ikke kode-eksempel.
> > Jakob gav et eksempel, som ville virke fint med det nuværende setup.
> >
> > Mvh
> > Jimmy
> >
> >
> >
>
> Hvis du sætter findID="69," så er der ingen problemer, ellers finder den
> bare den første "69" der passer - altså "6969" i din streng.
>
Nej - Hvis du sætter den til "69," vil den matche 6969.
Sætter du den til ",69," vil den i ovennævnte streng finde den korrekte
spiller.
Men hvad med strengen "12,34,6969,69" ?
Man kan blive ved med at udtænke situationer, hvor din metode vil fejle, da
det grundlæggende databasedesign er forkert.
Mvh
Jimmy
| |
|
|