• User

    Selezionare campo random da tabella mysql

    Salve a tutti 🙂

    Vorrei riuscire a selezionare un campo random in una tabella mysql..

    (sto scrivendo una funzione)

    
    function core() {
    include('conn.php'); //dati collegamento db
    
    $select = 'SELECT user FROM pool WHERE actual != max'; 
    
    //vorrei mettere i campi risultanti in un array e poi usare la funzione php //shuffle e poi fare echo $nome_array[0]; x ricavare un utente random.
    }
    
    

    Sapreste aiutarmi?

    Grazie in anticipo.


  • ModSenior

    Ciao ceorge,
    ma devi ricavare un campo o un utente? Sono 2 cose molto differenti.


  • User

    Il nome di un utente:) grazie per la pronta risposta!


  • ModSenior

    Puoi fare ORDER BY rand() LIMIT 1 direttamente nella query.


  • User

    È ciò che sto già usando...
    Però se la tabella ha dimensioni molto grandi 10000+ campi risulta un metodo molto lento.... perciò vorrei affidarmi al php. 😄


  • ModSenior

    Fai attenzione alle maiuscole e a non utilizzare lo stile sms nei tuoi messaggi...
    Per quanto riguarda il problema, una query di quel tipo su 10000 record(Non campi :D)non è nulla di così complesso, farlo in php semmai è un suicidio perchè dovresti fare una query enorme e poi usare pure php.


  • User

    Ok, grazie 😄


  • User Attivo

    Se la tua query è molto lenta potrebbe esserci spazio per ottimizzare la tabella (ad esempio aggiungendo un indice) o direttamente il vincolo LIMIT.

    Parti da qui per leggere qualcosa in proposito:
    h t t p : //dev.mysql.com/doc/refman/5.0/en/limit-optimization.html
    h t t p ://dev.mysql.com/doc/refman/5.0/en/explain.html


  • User

    Buongiorno a tutti,
    so che la discussione è molto vecchia, ma spero qualcuno possa comunque rispondere.
    Il mio problema è "complesso" ma proverò a snocciolarlo per punti. Il fulcro della questione è la possibilità di selezionare 5 valori su 10 in modalità random con un unico vincolo ovvero la somma dei primi 5 valori selezionati deve essere più simile possibile alla somma dei restanti 5 valori (o alla metà della somma totale dei 10 valori iniziali).

    Non sono sicuro che sia chiara la questione. Siccome non so neanche da che parte cominciare e sono decisamente un programmatore php amatoriale, sapreste almeno indirizzarmi da qualche parte? Conviene farlo con PHP o conviene elaborare questi dati in altro modo?

    Grazie mille


  • User Attivo

    La butto lì:

    1. Prima sommi tutti i valori per ottenere il totale, e calcoli la metà.
      Esempio hai somma 100 per 10 persone.

    2. Poi prendi 5 random, se il valore di questi è diverso per più o meno l'X % (che decidi tu) rispetto al pari perfetto:
      3a. - se sei sopra, di questi 5 prendi il maggiore, calcola quanti punti dovresti perdere per avvicinarti al pari perfetto, e rifai una query sui 5 restanti mettendo come condizione che devono avere un valore inferiore (e max = al valore che ti serve per arrivare al pareggio). Poi ripeti il check al punto 2.
      3b. - se sei sotto, di questi 5 prendi il minore, calcola quanti punti dovresti aumentare per avvicinarti al pari perfetto, e rifai una query sui 5 restanti mettendo come condizione che devono avere un valore maggiore (e max = al valore che ti serve per arrivare al pareggio). Poi ripeti il check al punto 2.

    Ripeti il 3 (a o b) finché non ti avvicini al pareggio. Questo permette di ribaltare anche situazioni molto impari tipo 80-20. Col primo ciclo magari vai a 66-34, col secondo 60-40, col terzo 58-42, col quarto 53-47 (e se rientra nella percentuale, es 5%, ti fermi).

    Terminato il ciclo dovresti avere una situazione più o meno alla pari.

    Metodo 2:

    1. Prima sommi tutti i valori per ottenere il totale e dividi per 10 (valore medio)
    2. Selezioni solo 1 random alla volta: se il valore totale dei selezionati (al primo giro è uno) è > di valore_medio * X (dove X = numero selezionati fino a quel momento), quello successivo lo prendi random con la condizione che deve avere un valore inferiore del valore medio. Viceversa se è < ne peschi uno con valore >. E ti fermi alla selezione 5.
      Personalmente preferisco questa, senza provare a mettere giù del codice mi sembra più semplice.

    Chiaramente lavora il tutto in php (es. array), non fare una query alla volta al db.


  • User

    Ciao Gigi991,
    Grazie mille per la risposta rapida e precisa. Entrambi i metodi mi sembrano praticabili e funzionanti. Convengo con te che il secondo a naso sembra meno impegnativo a livello di codice. Proverò a scrivere il codice e spero di venirne a capo!