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

    [MYSQL] Estrazione di 10 record in modo causale

    Salve a tutti, sono qui a chiedere un consiglio.
    Ho una base di dati di circa 160 record che però ho necessità di estrarre in modo casuale in gruppi da 10.

    Ho provato varie funzioni ma non riesco a trovare una soluzione decente che mi impedisca di avere troppo spesso le stesse domande anche se in posizioni diverse

    La query che avevo trovato migliore era questa:

    Select *,(RAND() * id) 'rand_ind' from elenco ORDER BY rand_ind LIMIT 0,10

    purtroppo però noto che escono comunque spesso delle domande rispetto che altre

    consigli?

  2. #2
    Utente di HTML.it L'avatar di clasku
    Registrato dal
    Aug 2006
    Messaggi
    3,197
    visto che non hai molti record, proverei anche con
    codice:
    SELECT * FROM elenco ORDER BY RAND() LIMIT 10
    anche se proprio il basso numero di record non aiuta ad avere domande sempre diverse

  3. #3
    Era una delle prime prove che avevo fatto ma ci sono purtroppo record che escono più spesso di altri.

    Ho fatto un controllo sulla base di 112 generazioni casuali e una base di record pari a 48
    ci sono record che sono usciti 39 volte altre solo 14

  4. #4
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Quote Originariamente inviata da sally3000 Visualizza il messaggio
    ....... ci sono record che sono usciti 39 volte altre solo 14
    La casualità del caso
    A me sembra che 39 su 14 sia abbastanza normale


    Se invece vuoi una casualità "meno casuale" allora penserei a:

    - aggiungere un campo numerico ( chiamiamolo per intenderci Nnn )

    - estrarre comunque i record in modo Random ( poi vediamo come )

    - ai record estratti aggiungiamo una unita al valore del campo Nnn
    (quindi è un contatore delle "uscite" )

    - alla prossima estrazione Random dobbiamo tenere conto del valore di Nnn
    preferendo quelli che hanno un Nnn basso

    Facci sapere se potrebbe andare bene in modo da poter
    pensare eventualmente anche alle query/procedure

    .

  5. #5
    nman non mi sembra una brutta idea
    Diciamo ce questi record verranno estratti molte volte e ho bisogno di uniformare il più possibile la casualità di uscita.
    Ho provato a fare vari test salvando i dati ed estraendo le statistiche usando in vari modi la funzione rand() ma le statistiche di uscita si aggirano sempre su quei valori con specifici record che escono il 50% delle volte altri invece solo il 10%

    2 cose però bisogna tenere in considerazione. La stessa procedura potrebbe essere richiamata in contemporanea da più utenti e ovviamente il tutto non deve stressare troppo la macchina ipotizzando per esempio 100 chiamate "quasi" contemporanee

    Per questo avevo pensato ad una procedura diretta nel db piuttosto che un ibrido php+mysql per evitare di sovraccaricare il server

    non avrei idea da dove cominciare se non creando il campo, hai qualche dritta?
    Ultima modifica di sally3000; 19-04-2017 a 21:14

  6. #6
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Pero questa estrazione casuale !!!!!
    Non lavorererai mica per quelli delle tasse ?????

    .

  7. #7
    Ah ah ah no
    sono delle domande che però non voglio vengano poste sempre le stesse tutto qui

    ovviamente mi riferisco alla procedura in mysql, in php saprei realizzarla ma mi interesserebbe capire come fare tutto questo con una semplice query o procedure
    Ultima modifica di sally3000; 19-04-2017 a 22:27

  8. #8
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    Quote Originariamente inviata da sally3000 Visualizza il messaggio
    ovviamente mi riferisco alla procedura in mysql, in php saprei realizzarla ma mi interesserebbe capire come fare tutto questo con una semplice query o procedure
    Ho dei dubbi,
    Tu sei in multiutenza e con la procedura che ho abbozzato
    dovresti modificare dei valori in tabella,
    ma per chiamate contemporanee potresti avere delle rogne
    perche tutti andrebbero a leggere e modificare gli stessi campi

    poi la procedura in MySql io non sono capace a farla,
    la ho abbozzata in VBA solo per buttare li una ipotesi



    Aggiungiamo alla nostra tabella 2 campi:
    Nnn numerico che è il contatore delle "uscite"
    Fff Testo che è una specie di Flag che identifica i tuoi 10 record estratti
    Idx chiaramente è la sua Key numerica


    La procedura MySql potrebbe essere composta da 2 query

    1°)
    Reimposta a Vuoto i 10 record che erano stati identificati nella estrazione precedente
    ........ Execute ("UPDATE T1 Set T1.Fff = '' WHERE LunghezzaStringa(T1.Fff)>0;")


    2°)
    Immagina di estrarre i primi 10 record ordinati per Nnn e per Random
    SELECT TOP 10 T1.Nnn, T1.Fff FROM T1 ORDER BY T1.Nnn, Rnd([T1.Idx])
    quelli sono i tuoi record pescati e innanzitutto gli fai un UPDATE
    per incrementare di 1 il campo Nnn
    e per mettere un Flag nel campo Fff
    quindi:
    .... dbex.Execute ("UPDATE
    (
    SELECT TOP 10 T1.Nnn, T1.Fff FROM T1 ORDER BY T1.Nnn, Rnd([T1.Idx])) AS V1
    SET V1.Nnn = (If IsNull(V1.Nnn) Then 1 Else V1.Nnn End)+1, V1.Fff = 'x';")



    3°)
    Adesso con php puoi estrarre i tuoi 10 record che contrassegnati con la "x"
    SELECT Campo1, Campo2, CampoEccetera FROM T1 WHERE T1.Fff = 'x';


    Ti ripeto prendila solo come idea poi la devi adattare al tuo contesto

    .

  9. #9
    Utente di HTML.it L'avatar di nman
    Registrato dal
    Jan 2011
    residenza
    Milano
    Messaggi
    1,333
    .... azz !!
    Ma non riesco a correggere gli errori di digitazione ......
    quel ....... Then 1 Else ...... va corretto in ....... Then 0 Else ......

    Poi è lampante che al posto di LunghezzaStringa dovrai metterci Len, Lenght o cos'altro

    anche quel ..... If IsNull(.........)..... sara da mettere a posto

    .

Tag per questa discussione

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