Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Selezionare dati con una select, per poi stamparli in maniera casuale

    Salve, ho una query piò o meno così:
    codice:
    "SELECT 'Id' FROM tabella WHERE campo1 LIKE '%nome' ORDER BY data LIMIT 1, 10"
    Quindi seleziono tutti gli id con la dicitura nome in campo1 e gli ordino per data, ne consegue che verranno stampati i primi 10 risultati in ordine di data.
    Adesso quello che vorrei fare è: dopo aver selezionato questi dati stamparli nella pagina in maniera casuale, ma 5 alla volta.
    Girando su google ho trovato su un sito questo:
    codice:
    SELECT idArt,artName,artPrice FROM articoli ORDER BY RAND() LIMIT 0,5
    ,
    che è molto simile a quello che devo fare, con la differenza che io voglio selezionare sempre e solo i 10 risultati più alti a partire dalla data di creazione e poi stamparli in maniera casuale 5 alla volta.
    Come posso riuscire a farlo? Ultimo: il sito utilizza un linguaggio di tipo php.

  2. #2
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998

    Re: Selezionare dati con una select, per poi stamparli in maniera casuale

    codice:
    "select * from (
    SELECT 'Id' FROM tabella WHERE campo1 LIKE '%nome' ORDER BY data LIMIT 1, 10
    ) order by rand()"
    Non tutti i DB digeriscono LIMIT in una subquery...
    Il guaio per i poveri computers e' che sono gli uomini a comandarli.

    Attenzione ai titoli delle discussioni: (ri)leggete il regolamento
    Consultate la discussione in rilievo: script / discussioni utili
    Usate la funzione di Ricerca del Forum

  3. #3
    Ho seguito quello che hai scritto e sistemato così:
    codice:
    "(SELECT Id FROM tabella WHERE campo1 LIKE '%nome' ORDER BY data LIMIT 1, 10) order by rand() LIMIT 1, 5"
    Adesso estrae prima i risultati da 1 a 10 e poi limita a 5 la stampa dei risultati ottenuti per ogni pagina.
    Il problema è che andando a pagina 2 possono ritrovarsi risultati già usciti a pagina 1 (visto che rigenera la query ordinandoli in maniera casuale sempre sugli stessi record).
    Esiste un modo tramite SELECT per far sì che i risultati non vengano ripetuti, oppure devo sistemare per forza ajax meglio, perchè solo con delle query non è possibile farlo?

  4. #4
    Il problema è che con ORDER BY rand(), su una tabella di grandi dimensioni, è una delle cose più lente che si possano fare.

    In qualche caso si può fare WHERE id > (rand() * X)
    e se non ci sono buchi in id si può usare anche LIMIT.
    STK/Unit: Unit Test framework per MariaDB
    http://stk.wikidot.com/stk-unit

  5. #5
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998
    Originariamente inviato da _Marco_87
    Adesso estrae prima i risultati da 1 a 10 e poi limita a 5 la stampa dei risultati ottenuti per ogni pagina.
    Il problema è che andando a pagina 2 possono ritrovarsi risultati già usciti a pagina 1 (visto che rigenera la query ordinandoli in maniera casuale sempre sugli stessi record).
    Esiste un modo tramite SELECT per far sì che i risultati non vengano ripetuti, oppure devo sistemare per forza ajax meglio, perchè solo con delle query non è possibile farlo?
    Usa le variabili di sessione: la prima volta estraili tutti e 10, visualizza i primi 5 e memorizzati i secondi 5 id, alla seconda chiamata estra i 5 record corrispondenti agli id salvati...
    Il guaio per i poveri computers e' che sono gli uomini a comandarli.

    Attenzione ai titoli delle discussioni: (ri)leggete il regolamento
    Consultate la discussione in rilievo: script / discussioni utili
    Usate la funzione di Ricerca del Forum

  6. #6
    in the web: "Order by rand()" avviene dopo che sono stati selezionati i primi risultati, quindi diciamo che mischia solo quello che la query ha già estratto. Se metto:
    codice:
    "(SELECT Id FROM tabella WHERE campo1 LIKE '%nome' ORDER BY data LIMIT 1, 2) order by rand() LIMIT 1, 5"
    non mi stampa cinque risultati ma solo 2.


    br1:Adesso provo.


  7. #7
    Ah certo nel tuo caso è così... scusa, avrei dovuto leggere meglio
    STK/Unit: Unit Test framework per MariaDB
    http://stk.wikidot.com/stk-unit

  8. #8
    Di nulla, l'importante è che eri disposto a darmi una mano, inoltre mi hai fatto capire ch enon conviene fare selezioni casuali su tabelle di enormi dimensioni (cosa che terrò in considerazione per il futuro: "rand() è pesante..").

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 © 2025 vBulletin Solutions, Inc. All rights reserved.