|
| Sorter efter forbogstav, hvordan? Fra : Frederik Junkuhn |
Dato : 29-01-09 10:29 |
|
Hej,
Jeg har en database med en lang liste af referencer som jeg skal
have vist på en side. Men da det bliver ret uoverskueligt, vi jeg
gerne have at den kun viser dem der starter med "A" f.eks.
Min kode:
mysql_query("SELECT * FROM referencer WHERE navn LIKE 'a'");
På forhånd tak :)
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Gert Krabsen (29-01-2009)
| Kommentar Fra : Gert Krabsen |
Dato : 29-01-09 10:40 |
|
Frederik Junkuhn skrev:
> Hej,
>
> Jeg har en database med en lang liste af referencer som jeg skal
> have vist på en side. Men da det bliver ret uoverskueligt, vi jeg
> gerne have at den kun viser dem der starter med "A" f.eks.
>
> Min kode:
>
> mysql_query("SELECT * FROM referencer WHERE navn LIKE 'a'");
>
Prøv med
SELECT * FROM referencer WHERE left(navn ,1)='a'
| |
Frederik Junkuhn (29-01-2009)
| Kommentar Fra : Frederik Junkuhn |
Dato : 29-01-09 10:37 |
|
Gert Krabsen wrote in dk.edb.internet.webdesign.serverside.php:
> Frederik Junkuhn skrev:
> > Hej,
> >
> > Jeg har en database med en lang liste af referencer som jeg skal
> > have vist på en side. Men da det bliver ret uoverskueligt, vi jeg
> > gerne have at den kun viser dem der starter med "A" f.eks.
> >
> > Min kode:
> >
> > mysql_query("SELECT * FROM referencer WHERE navn LIKE 'a'");
> >
>
> Prøv med
>
> SELECT * FROM referencer WHERE left(navn ,1)='a'
Wow! Det var godt nok hurtigt.
Det virker skam også, mange tak :)
nu er jeg ret ny i php, så kan jeg få dig til at forklare kort hvad
"left(navn ,1)='a'" gør?
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Bertel Lund Hansen (29-01-2009)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 29-01-09 11:03 |
|
Frederik Junkuhn skrev:
> nu er jeg ret ny i php, så kan jeg få dig til at forklare kort hvad
> "left(navn ,1)='a'" gør?
Det er SQL. Det plukker en delstreng ud begyndende til venstre,
og delstrengen er 1 bogstav lang.
I PHP skal man skrive:
$partstring=substring($wholestring,0,1);
for at pille det venstre bogstav ud af en streng. 0 angiver at
man starter ved første tegn, og 1 er længden.
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
| |
Carsten (29-01-2009)
| Kommentar Fra : Carsten |
Dato : 29-01-09 11:21 |
|
"Bertel Lund Hansen" <unospamo@lundhansen.dk> skrev i en meddelelse
news:4iv2o4pbf75qmqopj8c3thgsjf5mt7ctbc@news.stofanet.dk...
> Frederik Junkuhn skrev:
>
>> nu er jeg ret ny i php, så kan jeg få dig til at forklare kort hvad
>> "left(navn ,1)='a'" gør?
>
> Det er SQL. Det plukker en delstreng ud begyndende til venstre,
> og delstrengen er 1 bogstav lang.
Hmmm, gad vide om mySql (som det vel er ?) egentlig kan klare en "like 'a%'
hurtigere end en left(navn ,1)='a' ?
Carsten
| |
Frederik Junkuhn (29-01-2009)
| Kommentar Fra : Frederik Junkuhn |
Dato : 29-01-09 11:52 |
|
Carsten wrote in dk.edb.internet.webdesign.serverside.php:
> "Bertel Lund Hansen" <unospamo@lundhansen.dk> skrev i en meddelelse
> news:4iv2o4pbf75qmqopj8c3thgsjf5mt7ctbc@news.stofanet.dk...
> > Frederik Junkuhn skrev:
> >
> >> nu er jeg ret ny i php, så kan jeg få dig til at forklare kort hvad
> >> "left(navn ,1)='a'" gør?
> >
> > Det er SQL. Det plukker en delstreng ud begyndende til venstre,
> > og delstrengen er 1 bogstav lang.
>
> Hmmm, gad vide om mySql (som det vel er ?) egentlig kan klare en "like 'a%'
> hurtigere end en left(navn ,1)='a' ?
>
> Carsten
>
Jeg testede det lige, og det ser ikke ud til at fungere. Men "left(navn
,1)='a'" virker fint. :)
> " You have an error in your SQL syntax; check the manual that corresponds to
your MySQL server version for the right syntax to use near 'LIKE 'a%'' at line
1 "
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Gert Krabsen (29-01-2009)
| Kommentar Fra : Gert Krabsen |
Dato : 29-01-09 12:16 |
|
Frederik Junkuhn skrev:
> Carsten wrote in dk.edb.internet.webdesign.serverside.php:
>> "Bertel Lund Hansen" <unospamo@lundhansen.dk> skrev i en meddelelse
>> news:4iv2o4pbf75qmqopj8c3thgsjf5mt7ctbc@news.stofanet.dk...
>>> Frederik Junkuhn skrev:
>>>
>>>> nu er jeg ret ny i php, så kan jeg få dig til at forklare kort hvad
>>>> "left(navn ,1)='a'" gør?
>>> Det er SQL. Det plukker en delstreng ud begyndende til venstre,
>>> og delstrengen er 1 bogstav lang.
>>
>> Hmmm, gad vide om mySql (som det vel er ?) egentlig kan klare en "like 'a%'
>> hurtigere end en left(navn ,1)='a' ?
>>
>> Carsten
>>
> Jeg testede det lige, og det ser ikke ud til at fungere. Men "left(navn
> ,1)='a'" virker fint. :)
>
>> " You have an error in your SQL syntax; check the manual that corresponds to
> your MySQL server version for the right syntax to use near 'LIKE 'a%'' at line
> 1 "
>
>
Den virker fint hos mig:
SELECT * FROM referencer WHERE navn like 'a%'
SELECT * FROM referencer WHERE left(navn ,1)='a'
giver - og bør give samme resultat.
Der skal formentlig ret store datamængder til, før du vil opleve
performance-forskel på de to metoder - men husk at indeksere feltet navn!
| |
Frederik Junkuhn (29-01-2009)
| Kommentar Fra : Frederik Junkuhn |
Dato : 29-01-09 13:29 |
|
Gert Krabsen wrote in dk.edb.internet.webdesign.serverside.php:
> Frederik Junkuhn skrev:
> > Carsten wrote in dk.edb.internet.webdesign.serverside.php:
> >> "Bertel Lund Hansen" <unospamo@lundhansen.dk> skrev i en meddelelse
> >> news:4iv2o4pbf75qmqopj8c3thgsjf5mt7ctbc@news.stofanet.dk...
> >>> Frederik Junkuhn skrev:
> >>>
> >>>> nu er jeg ret ny i php, så kan jeg få dig til at forklare kort hvad
> >>>> "left(navn ,1)='a'" gør?
> >>> Det er SQL. Det plukker en delstreng ud begyndende til venstre,
> >>> og delstrengen er 1 bogstav lang.
> >>
> >> Hmmm, gad vide om mySql (som det vel er ?) egentlig kan klare en "like 'a%'
> >> hurtigere end en left(navn ,1)='a' ?
> >>
> >> Carsten
> >>
> > Jeg testede det lige, og det ser ikke ud til at fungere. Men "left(navn
> > ,1)='a'" virker fint. :)
> >
> >> " You have an error in your SQL syntax; check the manual that corresponds to
> > your MySQL server version for the right syntax to use near 'LIKE 'a%'' at line
> > 1 "
> >
> >
>
> Den virker fint hos mig:
> SELECT * FROM referencer WHERE navn like 'a%'
> SELECT * FROM referencer WHERE left(navn ,1)='a'
>
> giver - og bør give samme resultat.
>
> Der skal formentlig ret store datamængder til, før du vil opleve
> performance-forskel på de to metoder - men husk at indeksere feltet navn!
>
>
>
>
>
>
Aha.. Jeg har skrevet "like" med versaler (LIKE). Det virker også for mig..
I skal have 1.000 tak for hjælpen!
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Peter Lykkegaard (29-01-2009)
| Kommentar Fra : Peter Lykkegaard |
Dato : 29-01-09 13:38 |
|
"Gert Krabsen" wrote
> SELECT * FROM referencer WHERE navn like 'a%'
> SELECT * FROM referencer WHERE left(navn ,1)='a'
> Der skal formentlig ret store datamængder til, før du vil opleve
> performance-forskel på de to metoder - men husk at indeksere feltet navn!
>
Hmm jeg sidder lige og spekulerer om mulighed nr 2 egentlig gør brug af evt
indeks på navn?
- Peter
| |
Stig Johansen (29-01-2009)
| Kommentar Fra : Stig Johansen |
Dato : 29-01-09 14:42 |
|
Peter Lykkegaard wrote:
> "Gert Krabsen" wrote
>
>> SELECT * FROM referencer WHERE navn like 'a%'
>> SELECT * FROM referencer WHERE left(navn ,1)='a'
>
>> Der skal formentlig ret store datamængder til, før du vil opleve
>> performance-forskel på de to metoder - men husk at indeksere feltet navn!
>>
> Hmm jeg sidder lige og spekulerer om mulighed nr 2 egentlig gør brug af
> evt indeks på navn?
De databaser, jeg kender, vil invalidere brug af index ved enhver form for
brug af funktioner.
Men ved mindre datamængder vil f.eks. MS SQLServer lave en table scan frem
for at bruge tid på at hive fat i b-træet.
--
Med venlig hilsen
Stig Johansen
| |
Carsten (29-01-2009)
| Kommentar Fra : Carsten |
Dato : 29-01-09 14:12 |
|
"Frederik Junkuhn" <frederik@junkuhn.com> skrev i en meddelelse
news:498176d7$0$90276$14726298@news.sunsite.dk...
> Jeg har en database med en lang liste af referencer som jeg skal
> have vist på en side. Men da det bliver ret uoverskueligt, vi jeg
> gerne have at den kun viser dem der starter med "A" f.eks.
Hvis det altid er sådan at dine "referencer" skal udvælges så kan du måske
overveje at lave en "redundant" kolonne i din tabel som netop indeholder
første bogstav af referencens navn. Det er noget hurtigere for
databasesystemet at lave en exact sammenligning end det er at lave den her
"left" funktion.
Carsten
| |
Frederik Junkuhn (29-01-2009)
| Kommentar Fra : Frederik Junkuhn |
Dato : 29-01-09 14:41 |
|
Carsten wrote in dk.edb.internet.webdesign.serverside.php:
> "Frederik Junkuhn" <frederik@junkuhn.com> skrev i en meddelelse
> news:498176d7$0$90276$14726298@news.sunsite.dk...
> > Jeg har en database med en lang liste af referencer som jeg skal
> > have vist på en side. Men da det bliver ret uoverskueligt, vi jeg
> > gerne have at den kun viser dem der starter med "A" f.eks.
>
> Hvis det altid er sådan at dine "referencer" skal udvælges så kan du måske
> overveje at lave en "redundant" kolonne i din tabel som netop indeholder
> første bogstav af referencens navn. Det er noget hurtigere for
> databasesystemet at lave en exact sammenligning end det er at lave den her
> "left" funktion.
>
> Carsten
>
> Tja... Nu er dette mit første PHP site, så jeg tror jeg stopper mens legen
er god.. :)
Men forstår jeg dig ret at jeg skal lave en celle i tabellen som jeg angiver
forbogstavet i og lister tabellen efter en istedet for f.eks. id?
Det skal lige siges at den database det skal bruges til næppe kommer over
1.000 rækker, så jeg håber "left" funktionen ikke er "for tung".
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Carsten (29-01-2009)
| Kommentar Fra : Carsten |
Dato : 29-01-09 14:56 |
|
"Frederik Junkuhn" <frederik@junkuhn.com> skrev i en meddelelse
news:4981b1d0$0$90275$14726298@news.sunsite.dk...
> Men forstår jeg dig ret at jeg skal lave en celle i tabellen som jeg
> angiver
> forbogstavet i og lister tabellen efter en istedet for f.eks. id?
>
> Det skal lige siges at den database det skal bruges til næppe kommer over
> 1.000 rækker, så jeg håber "left" funktionen ikke er "for tung".
så er problemet nok ikke så stort
men min ide gik på følgende... Din nuværende tabel ser måske ud som:
ID | NAVN | (MORE_COLUMNS HERE)
10 | Sven Bendt | (more data here)
11 | Niels Hansen | (more data here)
12 | Niller Petersen | (more data here)
...og din sql til at vise referencer med et bestemt startbogstav ser p.t. ud
som:
SELECT * FROM referencer WHERE left(navn ,1)='N'
Tabellen udvides til at se sådan her ud:
ID | NAVN | ALFANAVN| (MORE_COLUMNS HERE)
10 | Sven Bendt | S | (more data here)
11 | Niels Hansen | N | (more data here)
12 | Niller Petersen | N |(more data here)
Det du så kan gøre når du sætter nye rækker ind er at kolonnen "ALFANAVN"
altid sættes lig med "left(navn ,1)". Du får derved "straffen" ved
indsættelser (som der nok ikke er så mange af) istedet for at få straffen
hver gang der søges blandt dine "referencer". Din nye sql til søgninger
bliver:
SELECT * FROM referencer WHERE alfanavn='N'
Carsten
| |
Gert Krabsen (29-01-2009)
| Kommentar Fra : Gert Krabsen |
Dato : 29-01-09 15:25 |
|
Carsten skrev:
> "Frederik Junkuhn" <frederik@junkuhn.com> skrev i en meddelelse
> news:4981b1d0$0$90275$14726298@news.sunsite.dk...
>> Men forstår jeg dig ret at jeg skal lave en celle i tabellen som jeg
>> angiver
>> forbogstavet i og lister tabellen efter en istedet for f.eks. id?
>>
>> Det skal lige siges at den database det skal bruges til næppe kommer over
>> 1.000 rækker, så jeg håber "left" funktionen ikke er "for tung".
>
> så er problemet nok ikke så stort
>
> men min ide gik på følgende... Din nuværende tabel ser måske ud som:
>
> ID | NAVN | (MORE_COLUMNS HERE)
> 10 | Sven Bendt | (more data here)
> 11 | Niels Hansen | (more data here)
> 12 | Niller Petersen | (more data here)
>
> ..og din sql til at vise referencer med et bestemt startbogstav ser p.t. ud
> som:
>
> SELECT * FROM referencer WHERE left(navn ,1)='N'
>
> Tabellen udvides til at se sådan her ud:
>
> ID | NAVN | ALFANAVN| (MORE_COLUMNS HERE)
> 10 | Sven Bendt | S | (more data here)
> 11 | Niels Hansen | N | (more data here)
> 12 | Niller Petersen | N |(more data here)
>
> Det du så kan gøre når du sætter nye rækker ind er at kolonnen "ALFANAVN"
> altid sættes lig med "left(navn ,1)". Du får derved "straffen" ved
> indsættelser (som der nok ikke er så mange af) istedet for at få straffen
> hver gang der søges blandt dine "referencer". Din nye sql til søgninger
> bliver:
>
> SELECT * FROM referencer WHERE alfanavn='N'
>
Absolut en løsning. Men den dag sitet bliver en succes, så Frederik
bliver nødt til at gruppere på de to første bogstaver, er det hurtigere
simpelthen at ændre søgningen til
"WHERE left(navn ,1)='Ni'"
| |
Gert Krabsen (29-01-2009)
| Kommentar Fra : Gert Krabsen |
Dato : 29-01-09 15:26 |
|
Gert Krabsen skrev:
>
> Absolut en løsning. Men den dag sitet bliver en succes, så Frederik
> bliver nødt til at gruppere på de to første bogstaver, er det hurtigere
> simpelthen at ændre søgningen til
>
> "WHERE left(navn ,1)='Ni'"
Naturligvis
> "WHERE left(navn ,2)='Ni'"
| |
|
|