Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1
    Utente di HTML.it L'avatar di barnico
    Registrato dal
    Oct 2001
    Messaggi
    490

    ordinare in modo random su una colonna

    in una pagina php faccio una query su una tabella, solo che vorrei ordinare la lista di uscita in modo random su una tabella, mi spiego meglio:
    solitamente si può fare select * from tabella order by id asc;
    ora esiste la possibilità di fare select * from tabella order by id rand();
    perchè se uso solo order by rand() funziona solo che usando una paginazione mi ritrova nelle altre pagine valori presenti in altre pagine, mentre usando order by id rand() non funziona, forse non è una forma corretta?

  2. #2
    Utente di HTML.it L'avatar di ade_v
    Registrato dal
    Jan 2001
    Messaggi
    459
    metti il risultato della tua query SENZA l'utilizzo di ORDER BY RAND in una array con mysql_fetch_array, poi utilizzi la funzione shuffle (http://it2.php.net/manual/it/function.shuffle.php) per mescolare gli elementi dell'array; e infine ti tiri fuori i risultati con il solito ciclo for o while
    ade_v@yahoo.it

    Fletto i muscoli e sono nel vuoto

    Se inviate messaggi privati, avvisatemi sul forum...

  3. #3
    Crea in PHP un numero casuale ed utilizzalo come seed per la funzione RAND() di MySQL. Ovviamente dovrai propagare questo seed tra le varie pagine (es. tramite sessioni oppure query string).

    Vedi http://www.nyrodev.info/index.php/20...a-random-order

  4. #4
    Utente di HTML.it L'avatar di ade_v
    Registrato dal
    Jan 2001
    Messaggi
    459
    Scusa l'ignoranza, ma cosa significa utilizzare unn numero casuale come seed ? Cos'è seed ?
    ade_v@yahoo.it

    Fletto i muscoli e sono nel vuoto

    Se inviate messaggi privati, avvisatemi sul forum...

  5. #5
    dovresti fare come fanno i forum, ovvero la query ti salva l'elenco degli id degli oggetti in una tabella, dando un identificatore univoco per la ricerca (un md5(microtime()), per intenderci)..
    Così, passi in GET l'md5 e ti pagini i risultati, andando a beccarti gli id associati a quell'md5...

    Capito come?

    la query giusta è quella che hai scritto:

    select id from tabella where condizione=true order by rand();

    metti tutti gli id in una stringa unica, tipo:

    $tutti_gli_id = 1,4,6,7,33,23,5,22,2...;

    poi salvi il risultato:

    insert into risultati_ricerche (hash,id_oggetto) VALUES (md5('".microtime()."'),'".$tutti_gli_id."');

    Per paginarti il tutto, andrai a leggerti il campo id_oggetto, mettendolo in un array con un banalissimo explode, e ti leggi dall'array ottenuto le posizioni che ti interessano, rispettando la paginazione...

    Spero di essere stato chiaro..

    ...::: DESIDERARE E' UMANO :::...
    ...::: POSSEDERE E' DIVINO :::...
    ...::: HAVE A NICE DAY :::...
    (¯`·.¸¸.->ĐĮ ĦΞŁŁ<-.¸¸.·`¯)
    http://www.djhellclub.com

  6. #6
    Originariamente inviato da ade_v
    metti il risultato della tua query SENZA l'utilizzo di ORDER BY RAND in una array con mysql_fetch_array, poi utilizzi la funzione shuffle (http://it2.php.net/manual/it/function.shuffle.php) per mescolare gli elementi dell'array; e infine ti tiri fuori i risultati con il solito ciclo for o while
    ma non con mysql_fetch array() che rende due volte lo stesso record. quindi direi mysql_fetch_assoc() con shuffle()

    Se si deve fare una paginazione dei risultati non e' possibile usare rand() nell'ordinamento senza il rischio di avere ripetizioni, a meno che di segnare i record estratti in precedenza. ma poi che succede se altri fanno contemporaneamente una query simile?

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

  7. #7

  8. #8
    Originariamente inviato da piero.mac
    Se si deve fare una paginazione dei risultati non e' possibile usare rand() nell'ordinamento senza il rischio di avere ripetizioni, a meno che di segnare i record estratti in precedenza. ma poi che succede se altri fanno contemporaneamente una query simile?
    E' sufficiente passare a RAND() lo stesso seed per ogni query di paginazione. L'ordine causale resterà lo stesso sempre, e non vi saranno ripetizioni ne problemi di "concorrenza".

  9. #9
    Utente di HTML.it L'avatar di barnico
    Registrato dal
    Oct 2001
    Messaggi
    490
    ok, va bene, cvdo come fare.
    Thanks

  10. #10
    Originariamente inviato da filippo.toso
    E' sufficiente passare a RAND() lo stesso seed per ogni query di paginazione. L'ordine causale resterà lo stesso sempre, e non vi saranno ripetizioni ne problemi di "concorrenza".
    quindi non sara' piu' casuale.

    Il silenzio è spesso la cosa migliore. Pensa ... è gratis.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.