Newsgroup: it.comp.www.php
Titolo: [MySQL] estrazioni random... mica tanto

Salve avrei problemino con una tabella mysql.
La tabella si riferisce ad un programma di banner a rotazione.
Stabiliti i campi della tabella, con tutte le voci che mi interessano, nel
porgramma in php faccio scegliere il banner da mostrare pescando in random
un id dalla tabella.
Il mio problema è di dare delle priorità a un certo tipo di banner.
Ora mi spiego meglio.
Vorrei che dei banner da me selezionati, avessero una probabilità maggiore
di essere estratti.
Io avevo pensato....
Mi creo un'altra tabella di appoggio in cui inserisco tante volte il record
del banner, quant'è la priorità che gli scelgo.
Nel senso: in una scala da 1 a 10 di priorità, se metto un record con
priorità 4 questo verrà inserito nella seconda tabella 4 vole con lo stesso
id (che non ha proprietà di auto_increment ma solo di indice per poter
aggiornare dati come statistiche ecc ecc).
In questo modo, facendo la ricerca random sulla seconda tabella, il record
con priorità 4 (messo dentro 4 volte) sarà estratto 4 volte più facilmente
degli altri.
in quanto alle statistiche verrebbero aggiornate direttamente sulla prima
tabella, portando come riferimento l'id che rimane fermo per tutte le
repliche nella seconda tabella.
Lo so sono contorto, e per questo vi chiedo se magari esiste un metodo più
elegante (sicuramente esiste) e più veloce, per fare una cosa del genere.

Il mio problema è di dare delle priorità a un certo tipo di banner.
Mettere un campo PRIORITY, e poi ordinare in base a PRIORITY*RAND()?
Leonardo che non ci ha provato
-- 
Nior thainig ar major i dtus an lae chugainn,
is ni rabhamar fein ann i gcoir na gceart
ach mar sheolfai aoireacht bo gan aoire,
ar thaobh na greine de Sliabh na mBan.

Se ho capito bene:
Mi creo un campo priorità e nella ricerca random cerco per priorità a caso?
1dubbio: se ordino per priorità e faccio la ricerca estraendo i primi,
otterrò sempre i primi... (ma mi sa che ho capito male)
2dubbio: se faccio il random su i record ordinati per priorità avranno
sempre tutti la stessa probabilità d'uscire....

 ha scritto nel messaggio
news:9hoc8t$ukj$1...@nreadA.inwind.it...


Un'unica tabella....
Vediamo, nell'inserimento del banner metto la priorità la leggo come il
numero di volte che il banner deve essere inserito.
mmmm
Il banner viene inserito (per esempio) 4 volte.
Poi mi ritrovo le statistiche sparse per 4 record, da richiamare non più per
indice ma per nome cliente o nome banner.
Se invece mi tengo 2 tabelle... la prima completa, la seconda di solo
appoggio con indice e id dell'altra tabella,
ne ho una che mi serve solo per le estrazioni, e l'altra per tutto il resto.
....
Appena finisco ti mando il tutto.

otterrò sempre i primi... (ma mi sa che ho capito male)
No, hai capito bene. Il fatto e' che i primi NON SARANNO SEMPRE GLI
STESSI, dato che PRIORITY*RAND() e' variabile.
-- Test, per PostgreSQL (il concetto e' lo stesso)
CREATE TABLE test ( nome varchar(20), priority integer );
INSERT INTO test VALUES ('Quattro', 4);
INSERT INTO test VALUES ('Uno', 1);
INSERT INTO test VALUES ('Zero', 0);
( for i in $( seq 0 999 ); do  echo "SELECT nome FROM test ORDER 
BY priority*random() DESC LIMIT 1;"; done; ) \
 | psql test | grep "[A-Z]" | sort | uniq -c | sort -rn
    887  Quattro
    113  Uno
(ripete incredulo)
    876  Quattro
    124  Uno
Sgrunt. Non funziona... mi aspettavo 800/200 :-(((
Con priorita' tutte uguali (ho aggiunto ora "cinque") ottengo un
risultato abbastanza potabile:
    267  Quattro
    261  Zero
    239  Cinque
    233  Uno
Dando "Cinque" su priorita' 3, dovrebbe uscire meta' delle volte
e invece no:
    742  Cinque
     92  Quattro
     83  Zero
     83  Uno
Boh. Giurerei che la strada e' giusta, eppure... [1]
Leonardo IANAS
[1] ho il dubbio che si debba iterare rand() e non moltiplicarlo...?



brrr..... che soluzione da brivido!!! ma scherzate? per assegnare la
priorità usare una tabella aggiuntiva!?!
ti do una soluzione molto banale, ma che dovrebbe funzionare:
se 4 priorità ti crei un array con i numeri 1 22 333 4444 e così via; poi fa
un'estrazione random da questo array e quindi in questo modo ti scegli la
priorità dei membri da visualizzare; a questo punto estrai a caso con una
query tra i membri dalla tabella che hanno la priorità precedentemente
estratta.
Non è in questo modo che ho fatto il mio scambio banner, ma almeno ti
funziona.
Io ho progettato la logica nello stesso modo in qui funziona lo scheduling
dei processi nei Sistemi Operativi: con priorità + aging per evitare lo
stallo.
Happy work!
Banner Planet: 
www.softwareplanet.net/bp

Grande....
era quello che cercavo smuack.
Ero sicuro ci fosse un modo più elegante pratico e funzionale del mio :-)
Grazie mille


Di niente!
www.softwareplanet.net