Vous pouvez utiliser des variables définies par l'utilisateur ci-dessous, la requête vous donnera un enregistrement pour chaque âge distinct, la requête interne vérifie simplement les mêmes âges et leur donne un rang comme pour 4 mêmes âges (âge =1) le rang sera 1,2,3 ,4 et quand l'âge =2 alors le numéro de rang recommencera à partir de 1 et où le filtre de la requête externe filtre les lignes pour montrer où le rang est 1 donc pour chaque âge distinct, vous obtiendrez une ligne et elles sont triées au hasard
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
supposons que votre requête jointe vous donne les résultats comme
Exemple d'ensemble de données
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
.....
Maintenant, l'utilisation de la requête interne dans ma réponse vous donnera les ensembles de résultats avec la colonne de classement comme ci-dessous
Ensemble de résultats de requête interne
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
Comme dans l'ensemble de résultats ci-dessus, vous pouvez voir que l'âge =1 a 3 lignes et leurs rangs sont différents 1,2,3 même exemple pour l'âge =2 les rangs sont 1,2 identiques pour l'âge =4, Maintenant, dans ma réponse, la requête externe sera filtrez le résultat où rang =1 afin que le jeu de résultats final contienne une ligne pour chaque jeu de résultats distinct, comme voir ci-dessous
Sortie 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 partie de commande aléatoire se fait à la requête interne comme vous pouvez voir la commande par partie ORDER BY i.Age, RAND()
il ordonnera d'abord l'âge de manière ascendante, puis pour les mêmes valeurs d'âge, il ordonnera ensuite les résultats de manière aléatoire. J'espère que cela a du sens