Avatar billede andy Nybegynder
30. januar 2003 - 16:57 Der er 36 kommentarer og
2 løsninger

Problem med ORDER BY rand()

Jeg har et problem med "ORDER BY rand()". Problemet er at mysql ikke sorterer resultatsættet random. Har aldrig været ude for det før...

Siden ligger på en FreeBSD server med MySQL 3.23.54.

Hvad kan være galt?
Avatar billede ztyxx Nybegynder
30. januar 2003 - 16:58 #1
smid lige din select
Avatar billede andy Nybegynder
30. januar 2003 - 17:09 #2
SELECT col1, col2 FROM andy WHERE col1 != 'random' AND col3=1 ORDER BY rand() LIMIT 0,1
Avatar billede postndk Nybegynder
30. januar 2003 - 17:17 #3
SELECT col1, col2 FROM andy WHERE col1 != 'random' AND col3 = 1 ORDER BY RAND() LIMIT 1

virker her ...
Avatar billede andy Nybegynder
30. januar 2003 - 17:29 #4
Og hvilket system er det?
Avatar billede andy Nybegynder
30. januar 2003 - 17:29 #5
Som sagt jeg har ikke oplevet det før... Har snart kørt det script på 100 forskellige servere.
Avatar billede postndk Nybegynder
30. januar 2003 - 17:38 #6
hvordan skal den kunne sortere resultat sættet random, når der kun er 1 output ??
Avatar billede morw Nybegynder
30. januar 2003 - 18:43 #7
SELECT col1, col2, rand() AS tt
FROM andy
WHERE col1 != 'random'
AND col3=1
ORDER BY tt
LIMIT 0,1
Avatar billede morw Nybegynder
30. januar 2003 - 18:44 #8
postndk> fordi den sortere alle rækker FØR where træder i kraft
Avatar billede andy Nybegynder
30. januar 2003 - 23:07 #9
morw, tak for svaret, men det hjælper sku ikke.

Det virker fint på alle mulig andre servere, men ikke på denne...

Hvis jeg fjerner LIMIT og lader mysql selecte alle rows kommer de ALTID ud i samme rækkefølge... Jeg er virkelig helt lost..
Avatar billede morw Nybegynder
30. januar 2003 - 23:13 #10
Hmm. prøv at smide 3.23.55 ind i stedet
Avatar billede andy Nybegynder
30. januar 2003 - 23:20 #11
Det er ikke min server, så det kan jeg ikke bare lige...

Men jeg hører ham ad om han gider at opgrade eller for den sags skyld downgrade... :)
Avatar billede andy Nybegynder
03. februar 2003 - 12:01 #12
Nu har han fået PHP 4.3.0 og MySQL 3.23.55 på, men lige meget hjælper det....

Jeg sætter point op til 200...
Avatar billede morw Nybegynder
03. februar 2003 - 12:07 #13
Prøv lige at poste resultatet af:

SELECT col1, col2, rand() AS tt
FROM andy
WHERE col1 != 'random'
AND col3=1
ORDER BY tt
LIMIT 0,10
Avatar billede andy Nybegynder
03. februar 2003 - 12:16 #14
UPDATE: Har lige testet igen på en ny table men flere rows... Rows bliver sorteret random, men langt fra optimalt. 90% af gangene er det den samme row der kommer først...
Avatar billede andy Nybegynder
03. februar 2003 - 12:19 #15
På min egen maskine sorterer den 100% random (hvis der er noget der hedder det :) ) ved præcis samme query...
Avatar billede andy Nybegynder
03. februar 2003 - 12:23 #16
Hvis jeg SELECT'er med rand() AS tt og ORDER BY tt kan jeg se at genererer fine random numbers, men det er altid den samme row der har det mindste random tal og derfor står først i resultatsættet.

FX
0.0109233278882907
0.0464357650339937
0.199408872238741
0.324039491195268
0.391677694759963
0.500962825958582
0.674396442877498
0.69045889814427
0.699216632823662
0.764259279486033
0.85773709682537
Avatar billede morw Nybegynder
03. februar 2003 - 15:03 #17
hmm den maskine er fucked....
Avatar billede elk Nybegynder
05. februar 2003 - 14:05 #18
jeg har samme problem..... har et script der funker på MANGE servere....men ikke lige på vores udviklingsserver efter at vi har opdateret til version 3.23.54 af mysql. Har testet på andre servere der har samme mysql version og der er der samme problem....
Er det mon en bug i version 3.23.54 ????
Avatar billede andy Nybegynder
05. februar 2003 - 14:52 #19
elk> Jeg fik min kunde til at opdaterer til .55 men det hjalp ikke.

Kører du Linux? FreeBSD? Windows?
Avatar billede elk Nybegynder
05. februar 2003 - 15:05 #20
redhat 7,2
Avatar billede morw Nybegynder
05. februar 2003 - 15:31 #21
Har i ikke et dump? Så vil jeg lige prøve på min 3.23.55
Avatar billede andy Nybegynder
05. februar 2003 - 18:09 #22
k.

morw> Prøv selv at lave en tabel og kast nogle rows i den... Det er ligegyldigt med table layout... Har prøvet alt..
Avatar billede andy Nybegynder
05. februar 2003 - 18:13 #23
morw, jeg afviser dit svar... Du skal nok få nogle points senere for din indsats! Det ser nok bare lidt mere indbydende ud med 200 points og grønt flag... :D
Avatar billede morw Nybegynder
05. februar 2003 - 18:25 #24
Ja ja, men har i noget testdata?
Avatar billede morw Nybegynder
05. februar 2003 - 18:31 #25
Har lige testet med en tabel(25000 rækker) på 3.23.54 (troede egentlig det var 55). Nå men det virkede i al fald efter hensigten.

FreeBSD 4.7 med MySQL fra ports
Avatar billede elk Nybegynder
05. februar 2003 - 18:37 #26
bare noget så simpelt som 10 tupler i en tabel funker ikke....ihvertfald ikke på de servere med redhat og 3.23.54 jeg har prøvet det på.....

havde en tabel med 10 tupler (med navne på billeder)....der skulle random trækkes 3 billeder ud.....

"select imageName from images order by RAND() limit 3"

totalt simpelt......men den tager de samme hver gang.....

har flere andre scripts der også er begyndt at fucke op med denne version af mysql.......
Avatar billede morw Nybegynder
05. februar 2003 - 19:33 #27
Fatter det ikke. Nu har jeg lige lagt 3.23.55 ind på en testbox. Det virker fint. Hvad er det i laver ;-D
Avatar billede morw Nybegynder
05. februar 2003 - 19:34 #28
Bruger i innodb eller myisam?
Avatar billede andy Nybegynder
05. februar 2003 - 19:37 #29
Har lige prøvet med:
CREATE TABLE tester (
  row_id int(6) NOT NULL auto_increment,
  num1 varchar(50) NOT NULL default '',
  num2 varchar(50) NOT NULL default '',
  PRIMARY KEY  (row_id)
) TYPE=MyISAM;

#
# Data dump for tabellen `tester`
#

INSERT INTO tester VALUES (1, 'blah', 'blah1');
INSERT INTO tester VALUES (2, 'test', 'tester');
INSERT INTO tester VALUES (3, 'prut', 'prut');
INSERT INTO tester VALUES (4, 'ko', 'ko');
INSERT INTO tester VALUES (5, 'hus', 'hus');
INSERT INTO tester VALUES (6, 'buha', 'buha');

SELECT * FROM tester ORDER BY rand()

På tre forskellige maskiner...
1. : MySQL 3.23.39 på Red Hat 7.2 - virker
2. : MySQL 3.23.49 på Red Hat 7.2 - virker
3: : MySQL 3.23.55 på FreeBSD 4.7 - virker ikke

btw, fandt denne på google, http://www.gossamer-threads.com/forum/General_C8/Databases_and_SQL_F36/RAND()_P223923/
Vi er ikke de eneste elk...
Avatar billede andy Nybegynder
05. februar 2003 - 19:38 #30
MyISAM
Avatar billede morw Nybegynder
05. februar 2003 - 19:52 #31
No problem...

MySQL 3.23.55 på FreeBSD 4.7 - virker

mysql> SELECT * FROM tester ORDER BY rand();
+--------+------+--------+
| row_id | num1 | num2  |
+--------+------+--------+
|      3 | prut | prut  |
|      2 | test | tester |
|      6 | buha | buha  |
|      1 | blah | blah1  |
|      5 | hus  | hus    |
|      4 | ko  | ko    |
+--------+------+--------+
6 rows in set (0.01 sec)

mysql> SELECT * FROM tester ORDER BY rand();
+--------+------+--------+
| row_id | num1 | num2  |
+--------+------+--------+
|      1 | blah | blah1  |
|      3 | prut | prut  |
|      6 | buha | buha  |
|      4 | ko  | ko    |
|      2 | test | tester |
|      5 | hus  | hus    |
+--------+------+--------+
6 rows in set (0.00 sec)

mysql> SELECT * FROM tester ORDER BY rand();
+--------+------+--------+
| row_id | num1 | num2  |
+--------+------+--------+
|      5 | hus  | hus    |
|      3 | prut | prut  |
|      2 | test | tester |
|      4 | ko  | ko    |
|      6 | buha | buha  |
|      1 | blah | blah1  |
+--------+------+--------+
6 rows in set (0.00 sec)
Avatar billede morw Nybegynder
05. februar 2003 - 19:53 #32
Har du prøvet det der stod på den side:

SELECT * FROM tester ORDER BY rand(now());
Avatar billede morw Nybegynder
05. februar 2003 - 19:55 #33
Skummelt - med now() virker det *ikke* hos mig
Avatar billede morw Nybegynder
05. februar 2003 - 20:12 #34
I øvrigt. Hvorfor bruger den filesort, når data burde kunne være i ram?

mysql> explain SELECT * FROM tester ORDER BY rand();
+--------+------+---------------+------+---------+------+------+---------------------------------+
| table  | type | possible_keys | key  | key_len | ref  | rows | Extra                          |
+--------+------+---------------+------+---------+------+------+---------------------------------+
| tester | ALL  | NULL          | NULL |    NULL | NULL |    6 | Using temporary; Using filesort |
+--------+------+---------------+------+---------+------+------+---------------------------------+
1 row in set (0.00 sec)
Avatar billede andy Nybegynder
05. februar 2003 - 20:13 #35
ja, har prøvet det... Så er det bare en ny row der hele tiden står først
Avatar billede andy Nybegynder
03. april 2003 - 14:34 #36
luk
Avatar billede andy Nybegynder
03. april 2003 - 14:35 #37
Ellers så smid lige nogle svar elk og morw!
Avatar billede morw Nybegynder
03. april 2003 - 14:39 #38
et svar ;-D
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
Computerworld tilbyder specialiserede kurser i database-management

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