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