[php] Records in willekeurige volgorde

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Gaafy
  • Registratie: Juli 2001
  • Laatst online: 03-06-2024
Hoe krijg ik de records uit een db in een willkeurige volgorde?

Nu heb ik:

<?php
// Selecteer alle foto-tjes
$result = mysql_query("SELECT * FROM link ORDER BY RAND()") ;
while ($link = mysql_fetch_array($result)) {
?>

Maar het werkt voor geen meter.

Acties:
  • 0 Henk 'm!

  • sjroorda
  • Registratie: December 2001
  • Laatst online: 15:28
En waarom werkt het voor geen meter? Het is wel de juiste syntax namelijk. Wat zijn de problemen, de foutmeldingen, etc.? Je geeft een beetje weinig info...

Acties:
  • 0 Henk 'm!

  • MichelVH
  • Registratie: Oktober 2001
  • Laatst online: 16-09 20:54
Als je je resultaten in 1 grote array zet, kan je die array met behulp van shuffle in een willekeurige volgorde zetten

Don't be afraid of the dark, be afraid of what it hides


Acties:
  • 0 Henk 'm!

Verwijderd

Dat zul je op moeten lossen in je code denk ik. Een random gesorteerde resultset is volgensmij niet mogelijk.

[edit]
het kan dus wel :) weer wat nieuws geleerd

[ Voor 20% gewijzigd door Verwijderd op 08-04-2003 13:31 ]


Acties:
  • 0 Henk 'm!

Verwijderd

eh, volgens mij is het niet de juiste syntax. Je geeft 'm te orderen by een veld wat niet bestaat..

dit zou beter werken:

PHP:
1
2
3
// Selecteer alle foto-tjes 
$result = mysql_query("SELECT *, RAND() as randomfield FROM link ORDER BY randomfield") ; 
while ($link = mysql_fetch_array($result)) {<doe wat je wilt doen> }


//edit

heb het zelf even getest, works like a charm..

[ Voor 12% gewijzigd door Verwijderd op 08-04-2003 13:32 ]


Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

You can't use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times. From version 3.23 you can do: SELECT * FROM table_name ORDER BY RAND() This is useful to get a random sample of a set SELECT * FROM table1,table2 WHERE a=b AND c<d ORDER BY RAND() LIMIT 1000. Note that a RAND() in a WHERE clause will be re-evaluated every time the WHERE is executed. RAND() is not meant to be a perfect random generator, but instead a fast way to generate ad hoc random numbers that will be portable between platforms for the same MySQL version.

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

Verwijderd

eh chem, die info klopt dus niet. Mijn methode zoals hierboven beschreven, werkt gewoon.

//edit

bewijs:

Afbeeldingslocatie: http://www.tweakers.net/ext/f/3873/full.png

[ Voor 31% gewijzigd door Verwijderd op 08-04-2003 13:55 ]


Acties:
  • 0 Henk 'm!

  • Gaafy
  • Registratie: Juli 2001
  • Laatst online: 03-06-2024
bij mij werkt jouw methode nier hoor, kijk maar eens op www.gaafy.nl en druk en reload een paar keer.

Ook met mysql 3.23.54

Acties:
  • 0 Henk 'm!

Verwijderd

Ik neem aan dat je wilt dat die plaatjes wisselen? Want dat doen ze bij mij namelijk wel.. toegegeven, niet zo mooi als je zou willen..

hoeveel links heb je in die database.. het voorbeeldje hierboven betreft een database-tje met iets van 20 personen er in. Elke nieuwe query levert een andere volgorde op.

[ Voor 60% gewijzigd door Verwijderd op 08-04-2003 13:59 ]


Acties:
  • 0 Henk 'm!

  • Gaafy
  • Registratie: Juli 2001
  • Laatst online: 03-06-2024
Ik heb er nu 5 in mijn db, maar het maakt in pricipe niet uit of het er 5 of 100 zouden zijn.
Hij laat gewoon telkens het eerste record als eerst zien...

Acties:
  • 0 Henk 'm!

Verwijderd

Zuiver toeval. Voeg er eens een stuk of 20 toe. Echt waar, die db uit het bovenstaande screenshot laat elke keer netjes een nieuwe zien.

Post anders de gehele relevante code eens hier, inclusief de definitie van de tabel in kwestie.

Acties:
  • 0 Henk 'm!

  • Gaafy
  • Registratie: Juli 2001
  • Laatst online: 03-06-2024
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>Gaafy.nl</title>

<meta name="keywords" content="gaafy, gaafy.nl">
<meta http-equiv="content-type" content="text/html; charset=utf-8">

<link rel="stylesheet" href="gaafy/style.css" type="text/css">

</head><body><center>

[img]"gaafy/header.jpg"[/img]

<table border="0" width="80%">
<tr><td align="center">

<?php

mysql_connect ('localhost', 'user', 'pass');
mysql_select_db('gaafy');

// Selecteer alle foto-tjes
$result = mysql_query("SELECT *, RAND() as randomfield FROM gaafy ORDER BY randomfield") ;
while ($link = mysql_fetch_array($result)) {

print("
<a href=\"$link[url]\" target=\"new\">[img]\"gaafy/images/$link[id].gif\"[/img]</a>");}
?>

</td></tr></table>
<br>
</center></body></html>

Acties:
  • 0 Henk 'm!

  • Gaafy
  • Registratie: Juli 2001
  • Laatst online: 03-06-2024
CREATE TABLE gaafy (
id mediumint(9) NOT NULL auto_increment,
name varchar(50) NOT NULL default '',
url varchar(100) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM;

#
# Gegevens worden uitgevoerd voor tabel `gaafy`
#

INSERT INTO gaafy VALUES (1, 'Merel Roze', 'http://www.merelroze.com');
INSERT INTO gaafy VALUES (2, 'Loglijst', 'http://www.nederhoed.com/~jeewee/users/favlijst.php?user_id=189');
INSERT INTO gaafy VALUES (3, 'rood petje', 'http://bas.demeijer.com/roodpetje/');
INSERT INTO gaafy VALUES (4, 'omroep.nl', 'http://portal.omroep.nl/');
INSERT INTO gaafy VALUES (5, 'BBC', 'http://www.bbc.co.uk/');

Acties:
  • 0 Henk 'm!

Verwijderd

Raar.. toch denk ik dat het probleem opgelost is als je meer van die links gaat toevoegen.. 5 is gewoon te weinig, zeker omdat je er 5 weergeeft.

Vreemd fenomeen is het wel, als je Chem's reactie leest zou je zeggen dat het niet moet werken, en bij jou lijkt het ook niet te werken. Rare is echter dat het bij mij prima werkt, als ik 10 keer op 'execute query' klik krijg ik 10 keer een andere resultaatset..

//edit

krijg je overigens geen problemen met het feit dat je een veld als auto-inc definieerd en er vervolgens wel zelf waardes in gaat zetten? Voer de query eens uit in een tool (bv. dbexplorer van delpho, of de sql van webmin) om te kijken wat voor uitvoer je echt krijgt..

[ Voor 27% gewijzigd door Verwijderd op 08-04-2003 14:14 ]


Acties:
  • 0 Henk 'm!

  • Gaafy
  • Registratie: Juli 2001
  • Laatst online: 03-06-2024
Ik heb nu meer afbeeldingen toegevoegd op www.gaafy.nl, maar nog steeds een raar probleem. Het lijkt wel alsof de eerste records veel minder goed geschud worden dan de laatste.

Kijk maar eens en reload een paar keer. Ik gebruik nog steeds bovenstaande code.

Acties:
  • 0 Henk 'm!

Verwijderd

erg raar.. bij mij doet hij dat niet, op een soortgelijke tabel.. hoe ziet je tabel er in het echi uit, die ID's sluiten die een beetje op elkaar aan?

overigens zie je wel goed dat het voor de rest prima werkt.. een dirty fix zou zijn om gewoon de eerste 10 icons te scippen ofzo..

Acties:
  • 0 Henk 'm!

  • chem
  • Registratie: Oktober 2000
  • Laatst online: 11-09 11:19

chem

Reist de wereld rond

Verwijderd schreef op 08 april 2003 @ 13:45:
eh chem, die info klopt dus niet.
Bij mij werkt het wel. Grappig.

Klaar voor een nieuwe uitdaging.


Acties:
  • 0 Henk 'm!

Verwijderd

chem schreef op 09 April 2003 @ 19:37:
[...]

Bij mij werkt het wel. Grappig.
Is idd wazig, bij mij werken beide methodes, afhankelijk van welke tabel ik gebruik. Ik heb tenminste 1 tabel waarbij de order by rand() functie niet werkt, terwijl daar niets bijzonders aan is..

maw. helemaal lekker werkt 't nog niet..

Acties:
  • 0 Henk 'm!

  • Basszje
  • Registratie: Augustus 2000
  • Laatst online: 13:17

Basszje

Reisvaap!]

Ik doe trouwens ook altijd een select bla from table order by rand() limit 1; voor random quotes etc en daar heb ik nog nooit problemen mee ondervonden :)

Beware of listening to the imposter; you are undone if you once forget that the fruits of the earth belong to us all, and the earth itself to nobody.


Acties:
  • 0 Henk 'm!

  • Tirillo
  • Registratie: Januari 2002
  • Niet online

Tirillo

Joker of Unauwen

van mysql.com:
As of MySQL 3.23.52, MySQL changed the way
RAND() functions, such that you MUST supply a
SEED to get an actual random number. If you do
not, each new connection will return close to the
same number as the previous new connection. An
example to test this would be to run the follow
command multiple times in a row. mysql -u
username -p -e'select rand()' A basic way to seed
this would be to run RAND(NOW()).

...


Acties:
  • 0 Henk 'm!

  • Gaafy
  • Registratie: Juli 2001
  • Laatst online: 03-06-2024
Ik heb zelf een soort work-around bedacht, maar dat werkt ook nog niet helemaal perfect:

PHP:
1
2
3
4
5
6
7
8
9
// Haal de gegevens van deze photo uit de database. 
    $maximaal = mysql_fetch_array(mysql_query("SELECT MAX(id) FROM gaafy"));
    $aantal   = 9;
    $maximaal = $maximaal[0] - $aantal;
    $begin = rand(0,$maximaal);
    
// Selecteer alle foto-tjes 
    $result = mysql_query("SELECT * FROM gaafy  ORDER BY RAND() LIMIT $begin,$aantal;") ;  
    while ($link = mysql_fetch_array($result)) {

Nu komen de eerste records veel te weinig in beeld...

[ Voor 13% gewijzigd door Gaafy op 09-04-2003 23:10 ]


Acties:
  • 0 Henk 'm!

  • Gaafy
  • Registratie: Juli 2001
  • Laatst online: 03-06-2024
As of MySQL 3.23.52, MySQL changed the way
RAND() functions, such that you MUST supply a
SEED to get an actual random number.
Dat snap ik niet, wat is een "Seed"?

Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

Gaafy schreef op 10 April 2003 @ 21:39:
[...]


Dat snap ik niet, wat is een "Seed"?
als je nu het hele stukje quote ;)
As of MySQL 3.23.52, MySQL changed the way
RAND() functions, such that you MUST supply a
SEED to get an actual random number. If you do
not, each new connection will return close to the
same number as the previous new connection. An
example to test this would be to run the follow
command multiple times in a row. mysql -u
username -p -e'select rand()' A basic way to seed
this would be to run RAND(NOW()).
gewoon RAND(NOW()) doen, dan krijg je echt random, aangezien computers geen random getallen kunnen genereren heb je een "seed" nodig, een soort basisgetal, en met now() krijg je de huidige tijd, wat een goede basis is ;)
Pagina: 1