- Home
- Categorie
- Coding e Sistemistica
- MYSQL e altri Database
- Selezionare campo random da tabella mysql
-
Ciao ceorge,
ma devi ricavare un campo o un utente? Sono 2 cose molto differenti.
-
Il nome di un utente:) grazie per la pronta risposta!
-
Puoi fare ORDER BY rand() LIMIT 1 direttamente nella query.
-
È 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.
-
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.
-
Ok, grazie
-
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
-
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
-
La butto lì:
-
Prima sommi tutti i valori per ottenere il totale, e calcoli la metà.
Esempio hai somma 100 per 10 persone. -
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:
- Prima sommi tutti i valori per ottenere il totale e dividi per 10 (valore medio)
- 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.
-
-
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!