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à.
 

marino51

Utente Attivo
28 Feb 2013
2.903
160
63
Lombardia
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
 

Marco Vitaletti

Nuovo Utente
11 Apr 2013
5
0
0
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"
 

marino51

Utente Attivo
28 Feb 2013
2.903
160
63
Lombardia
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
 

Marco Vitaletti

Nuovo Utente
11 Apr 2013
5
0
0
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