Avatar billede Noone Nybegynder
09. juni 2006 - 22:24 Der er 4 kommentarer og
1 løsning

Sortere random udtræk

Jeg har en tabel med navne og der vil jeg lave et tilfældigt udtræk, som dog skal sorteres alfabetisk. Hvordan gøres det nemmest?

Tabellen ser sådan her ud:

mysql> describe navne;
+--------+--------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+--------------+------+-----+---------+----------------+
| id    | int(11)      |      | PRI | NULL    | auto_increment |
| name  | varchar(255) |      | MUL |        |                |
| gender | tinyint(1)  |      |    | 0      |                |
+--------+--------------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

Her er to eksempler på udtræk der gerne skulle sorteres efter feltet name

mysql> SELECT * FROM navne WHERE LENGTH(name) >= 3 AND LENGTH(name) <= 4 AND gender = 1 ORDER BY RAND() LIMIT 10;
+-------+------+--------+
| id    | name | gender |
+-------+------+--------+
|  6104 | Elli |      1 |
|  5224 | Bet  |      1 |
|  8634 | Mey  |      1 |
|  7876 | Lidy |      1 |
|  7196 | Jela |      1 |
| 10834 | Yuki |      1 |
| 10781 | Xin  |      1 |
|  6002 | Edua |      1 |
|  5996 | Edle |      1 |
| 10950 | Zoe  |      1 |
+-------+------+--------+
10 rows in set (0.15 sec)

mysql> SELECT * FROM navne WHERE LENGTH(name) >= 3 AND LENGTH(name) <= 4 AND gender = 0 ORDER BY RAND() LIMIT 10;
+------+------+--------+
| id  | name | gender |
+------+------+--------+
| 3409 | Ronn |      0 |
| 2428 | Lewi |      0 |
| 3373 | Roar |      0 |
|  368 | Ayad |      0 |
| 3154 | Phuc |      0 |
|  549 | Boie |      0 |
| 2010 | Joe  |      0 |
| 1903 | Jari |      0 |
|  994 | Eide |      0 |
|  853 | Dex  |      0 |
+------+------+--------+
10 rows in set (0.14 sec)

At sortere det i PHP vil være en temmeligt besværlig opgave i forhold til Aa der gerne skal sorteres som Å, hvilket MySQL gør uden problemer.
Avatar billede hmortensen Nybegynder
09. juni 2006 - 22:26 #1
Vil tro du kan gøre sådan her:
ORDER BY RAND(), name
Avatar billede hmortensen Nybegynder
09. juni 2006 - 22:32 #2
Det var noget vrøvl, skal nok nærmere være sådan her:
SELECT * FROM (SELECT * FROM navne WHERE LENGTH(name) >= 3 AND LENGTH(name) <= 4 AND gender = 0 ORDER BY RAND() LIMIT 10) x ORDER BY name
Avatar billede Noone Nybegynder
09. juni 2006 - 22:37 #3
Hmm..

mysql> SELECT * FROM (SELECT * FROM navne WHERE LENGTH(name) >= 3 AND LENGTH(name) <= 4 AND gender = 1 ORDER BY RAND() LIMIT 10) x ORDER BY name;
+------+------+--------+
| id  | name | gender |
+------+------+--------+
| 4575 | Alfa |      1 |
| 5876 | Disa |      1 |
| 6059 | Elfi |      1 |
| 6505 | Gigi |      1 |
| 7023 | Iona |      1 |
| 7410 | Kaja |      1 |
| 8740 | Mire |      1 |
| 9138 | Nona |      1 |
| 9820 | Shea |      1 |
| 9936 | Sira |      1 |
+------+------+--------+
10 rows in set (0.15 sec)

mysql> SELECT * FROM (SELECT * FROM navne WHERE LENGTH(name) >= 3 AND LENGTH(name) <= 4 AND gender = 1 ORDER BY RAND() LIMIT 10) x ORDER BY name;
+-------+------+--------+
| id    | name | gender |
+-------+------+--------+
|  4544 | Alba |      1 |
|  4650 | Amia |      1 |
|  5942 | Dot  |      1 |
|  6067 | Eli  |      1 |
|  7241 | Jie  |      1 |
|  8209 | Mai  |      1 |
|  8537 | Mee  |      1 |
|  9490 | Roda |      1 |
| 10596 | Vibe |      1 |
| 10673 | Vita |      1 |
+-------+------+--------+
10 rows in set (0.15 sec)

Det lader til at fungere som ønsket.. Herligt.. Jeg havde selv forsøgt noget lignende, men havde ikke lige fået * FROM ( og ) x med..
Avatar billede hmortensen Nybegynder
09. juni 2006 - 22:42 #4
X'et er blot et alias for temp tabellen, da mySQL ikke tillader tabel uden defination.
Avatar billede Noone Nybegynder
09. juni 2006 - 22:46 #5
Tja, så blev jeg det klogere idag :)
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

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