Puede usar las variables definidas por el usuario a continuación, la consulta le dará un registro por cada edad distinta, la consulta interna solo verifica las mismas edades y les otorga un rango como para 4 mismas edades (edad =1) el rango será 1,2,3 ,4 y cuando la edad =2, el número de rango comenzará desde 1 nuevamente y donde el filtro de la consulta externa está filtrando filas para mostrar donde el rango es 1, por lo que para cada edad distinta obtendrá una fila y se ordenarán aleatoriamente
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
supongamos que su consulta unida le da los resultados como
Conjunto de datos de muestra
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
.....
Ahora, usar la consulta interna en mi respuesta le dará los conjuntos de resultados con la columna de clasificación como se muestra a continuación
Conjunto de resultados de consultas internas
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
Como en el conjunto de resultados anterior, puede ver que edad =1 tiene 3 filas y sus rangos son diferentes 1,2,3 mismo ejemplo para edad =2 rangos son 1,2 iguales para edad =4, ahora en mi respuesta la consulta externa será filtre el resultado donde rango =1 para que el conjunto de resultados final contenga una fila para cada elemento distinto como se muestra a continuación.
Salida final
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 de orden aleatorio se realiza en la consulta interna, como puede ver el orden por parte ORDER BY i.Age, RAND()
primero ordenará la edad de manera ascendente y luego, para los mismos valores de edad, ordenará los resultados aleatoriamente. Espero que tenga sentido