[PHP/MySQL]SQL query om bepaalde selectie te maken uit users

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • XdeckX
  • Registratie: September 2002
  • Niet online
Ik ben bezig met het schrijven van een eigen forum (een iets oudere versie draait al een tijdje en heeft ongeveer 1300 members)
Ik heb dus voor die members een memberlist gemaakt die sorteerd op letter.
dus door het aanklikken van linkje A krijg je alle gebruikers beginnend met letter A.

hetzelfde heb ik voor gebruikers met een getal als 1 karakter maar er zijn dus ook members die een speciaal karakter gebruiken als 1e 'letter' (bijv -name-)

ik wil mijn getal query uitbreiden zodat ik alle gebruikers krijg die beginnen met een getal of met een speciaal karater (eigenlijk dus alle gebruikers die geen alfabetische letter als 1e letter hebben)

de query voor de getalgebruikers is als volgt
code:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT * FROM board_user WHERE 
        login LIKE '0%' OR 
        login LIKE '1%' OR 
        login LIKE '2%' OR 
        login LIKE '3%' OR 
        login LIKE '4%' OR 
        login LIKE '5%' OR 
        login LIKE '6%' OR 
        login LIKE '7%' OR 
        login LIKE '8%' OR 
        login LIKE '9%' 
                ORDER BY login


maar hoe kan die die rare tekens er in opnemen?

ik heb al geprobeerd een !LIKE query maar dat wil dus niet ;)

[ Voor 9% gewijzigd door XdeckX op 23-04-2004 11:52 ]


Acties:
  • 0 Henk 'm!

  • XdeckX
  • Registratie: September 2002
  • Niet online
dat was dus de quote ipv de edit :)

[ Voor 98% gewijzigd door XdeckX op 23-04-2004 11:52 ]


Acties:
  • 0 Henk 'm!

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 30-08 11:55
het tegenovergestelde van LIKE is NOT LIKE ;)

maar mischien kan je beter kijken naar de mysql regular expression functie

http://dev.mysql.com/doc/mysql/en/Regexp.html

Acties:
  • 0 Henk 'm!

  • XdeckX
  • Registratie: September 2002
  • Niet online
kijk daar kan ik dus wat mee..... de makkelijkste manier is denk ik gewoon een NOT LIKE inbouwn... maar das niet de mooiste manier (niet dat ik zoveel geef om mooi coden... zolang het werkt ;))

bedankt!

Acties:
  • 0 Henk 'm!

  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 30-08 11:55
je kan ook nog dit proberen

code:
1
SELECT * FROM board_user WHERE login REGEXP '^[^[:alnum:]]+'


niet getest maar in theorie zou deze alle users moeten selecteren waar de username niet begint met alpha numerieke tekens :)

regular expressions zijn echter niet zo heel snel, dus ik zou het gewoon ff benchmarken :)

Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
* bigtree is dol op benchmarks.

Dataset: 70.000 records, eerste letter enigszins evenredig over de ascii waarden 32-127 verdeeld.
code:
1
2
SELECT COUNT(*) FROM board_user 
WHERE login REGEXP '^[^[:alnum:]]+'
Gem. na 3 tests: ongeveer 0,47s.

code:
1
2
SELECT COUNT(*) FROM  `board_user` 
WHERE ASCII(UPPER(LEFT(login, 1))) NOT BETWEEN 65 AND 90;
Gem. na 3 tests: ongeveer 0,20s.

code:
1
2
3
SELECT COUNT(*) FROM  `board_user` 
WHERE NOT ((ASCII(LEFT(login, 1)) BETWEEN 65 AND 90) 
OR (ASCII(LEFT(login, 1)) BETWEEN 97 AND 122))
Gem. na 3 tests: ongeveer 0,21s.

Optie 2 lijkt mij dus de beste.

[edit]Deze ook nog even getest:
code:
1
2
SELECT COUNT(*) FROM board_user 
WHERE login NOT REGEXP '^[A-Za-z]';
Gem. na 3 tests: ongeveer 0,40s. Is dus iets sneller dan optie 1, maar duurt nog steeds liefst 2 keer zo lang als optie 2.

[edit2]Zo zie je maar hoe inefficient RegExpen kunnen zijn voor simpele dingen:
code:
1
2
SELECT COUNT(*) FROM board_user 
WHERE UPPER(login) NOT REGEXP '^[A-Z]';
Gem. na 3 test: 0,34s. Wordt dus al een stuk sneller door de RegExp minder zwaar in te zetten.

[ Voor 34% gewijzigd door bigtree op 23-04-2004 20:42 ]

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.

Pagina: 1