Mysql
 sql >> Base de données >  >> RDS >> Mysql

SQL renvoie 100 lignes aléatoires pour chaque âge

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