Mysql
 sql >> Database >  >> RDS >> Mysql

SQL restituisce 100 righe casuali per ogni età

Puoi utilizzare le variabili definite dall'utente sotto la query ti darà un record per ogni età distinta, la query interna sta solo controllando le stesse età e dando loro un rango come per 4 stesse età (età =1) il rango sarà 1,2,3 ,4 e quando età =2, il numero di rango ricomincerà da 1 e dove il filtro della query esterna sta filtrando le righe per mostrare dove il rango è 1 quindi per ogni età distinta otterrai una riga e saranno ordinate casualmente

SELECT  c.name, c.Gender, c.Age, c.MP, c.score
FROM (
SELECT i.name, i.Gender, i.Age, i.MP, b.score,
@r:= CASE WHEN @g = i.Age THEN @r + 1 ELSE 1 END rownum,
@g:=i.Age
FROM i
INNER JOIN b ON b.name=i.name
CROSS JOIN(SELECT @g:=NULL ,@r:=0) a
WHERE i.MP='F' AND i.gender='F' AND b.score<=-1
ORDER BY  i.Age, RAND()
) c
WHERE c.rownum = 1
ORDER BY c.Age
LIMIT 100

supponiamo che la tua query unita ti dia i risultati come

Set di dati campione

name   gender  Age  Mp score
============================
test1  male    1    1   10
test2  male    1    1   10
test3  male    1    1   10
test4  male    2    1   10
test5  male    2    1   10
test6  male    3    1   10
test7  male    4    1   10
test8  male    4    1   10
.....

Ora l'uso della query interna nella mia risposta ti darà i set di risultati con la colonna del rango come di seguito

Set di risultati della query interna

name   gender  Age  Mp score rank
==================================
test2  male    1    1   10    1
test1  male    1    1   10    2
test3  male    1    1   10    3
test4  male    2    1   10    1
test5  male    2    1   10    2
test6  male    3    1   10    1
test7  male    4    1   10    1
test8  male    4    1   10    2

Come nel set di risultati sopra puoi vedere per età =1 ha 3 righe e i loro ranghi sono diversi 1,2,3 stesso esempio per età =2 ranghi sono 1,2 uguali per età =4, Ora nella mia risposta la query esterna sarà filtra il risultato dove rank =1 in modo che il set di risultati finali contenga una riga per ogni distinto, come vedi sotto set di risultati

Risultato finale

name   gender  Age  Mp score rank
==================================
test2  male    1    1   10    1
test4  male    2    1   10    1
test6  male    3    1   10    1
test7  male    4    1   10    1

La parte di ordinamento casuale viene eseguita nella query interna poiché puoi vedere l'ordine per parte ORDER BY i.Age, RAND() prima ordinerà l'età in modo ascendente e poi per gli stessi valori di età ordinerà ulteriormente i risultati in modo casuale. Spero che abbia senso