Query mysql per selezioni random in categorie mirate

Marco Vitaletti

Nuovo Utente
11 Apr 2013
5
0
0
Salve a tutti,
sto cercando di estrarre da un database alcuni record in maniera casuale ma andando a pescarli secondo un certo criterio.
ho una tabella con una colonna contenuti e una capitoli, vorrei estrarre ad esempio due record casuali per il capitolo 1, tre per il capitolo 2 otto per il capitolo 3 ecc

| id | capitoli |
----------------
1 1
----------------
2 1
----------------
3 1
----------------
4 2
----------------
5 2
----------------
6 2
----------------
7 3
----------------
8 4
----------------
9 4
----------------
10 4
----------------
ecc..
----------------

I record sono 1000 e i capitoli 7, al momento non riuscendo a trovare altro modo sto eseguendo 7 query, una per capitolo, sicuramente questo non e' il massimo della pulizia e funzionalità.
 
ciao, oltre all'esempio se avessi postato le query, potevi aiutare noi a capire meglio,
così l'unico suggerimento, è di usare "UNION" per avere una sola query
 
Si hai perfettamente ragione, posto sotto un esempio

"SELECT * FROM tabella WHERE tipologia = 1 AND capitoli IN (1,2,3,4,5,6,7) ORDER BY RAND() LIMIT 20"

questa diciamo che e' la query di partenza quello che in pratica avrei bisogno di fare sarebbe questo:

"SELECT * FROM tabella WHERE tipologia = 1 AND capitoli = 1 ORDER BY RAND() LIMIT 2"
"SELECT * FROM tabella WHERE tipologia = 1 AND capitoli = 2 ORDER BY RAND() LIMIT 1"
"SELECT * FROM tabella WHERE tipologia = 1 AND capitoli = 3 ORDER BY RAND() LIMIT 5"
"SELECT * FROM tabella WHERE tipologia = 1 AND capitoli = 4 ORDER BY RAND() LIMIT 3"
"SELECT * FROM tabella WHERE tipologia = 1 AND capitoli = 5 ORDER BY RAND() LIMIT 2"
"SELECT * FROM tabella WHERE tipologia = 1 AND capitoli = 6 ORDER BY RAND() LIMIT 4"
"SELECT * FROM tabella WHERE tipologia = 1 AND capitoli = 7 ORDER BY RAND() LIMIT 3"
 
salvo smentite, non credo ci sia una soluzione migliore perché "order by" ma soprattutto "limit" sono legati alla singola "select"
se vuoi avere un singolo risultato, puoi usare "union", ovvero,
Codice:
$sql="
(SELECT * FROM tabella WHERE tipologia = 1 AND capitoli = 1 ORDER BY RAND() LIMIT 2) UNION
(SELECT * FROM tabella WHERE tipologia = 1 AND capitoli = 2 ORDER BY RAND() LIMIT 1) UNION
.....
(SELECT * FROM tabella WHERE tipologia = 1 AND capitoli = 7 ORDER BY RAND() LIMIT 3)
";
al limite creando la query in modo dinamico, se necessario
 
salvo smentite, non credo ci sia una soluzione migliore perché "order by" ma soprattutto "limit" sono legati alla singola "select"
se vuoi avere un singolo risultato, puoi usare "union", ovvero,
Codice:
$sql="
(SELECT * FROM tabella WHERE tipologia = 1 AND capitoli = 1 ORDER BY RAND() LIMIT 2) UNION
(SELECT * FROM tabella WHERE tipologia = 1 AND capitoli = 2 ORDER BY RAND() LIMIT 1) UNION
.....
(SELECT * FROM tabella WHERE tipologia = 1 AND capitoli = 7 ORDER BY RAND() LIMIT 3)
";
al limite creando la query in modo dinamico, se necessario

Ok, mi sembra una soluzione accettabile dato che il numero delle query e' fisso a 7, e che comunque creandole in modo dinamico sono gestibili abbastanza semplicemente

Provo subito, grazie
 

Discussioni simili