Du kan använda användardefinierade variabler nedan. Frågan kommer att ge dig en post för varje distinkt ålder, den inre frågan kontrollerar bara för samma åldrar och ger rang till dem som för 4 samma åldrar (ålder =1) rangen kommer att vara 1,2,3 ,4 och när ålder =2 kommer rangnummer att börja från 1 igen och där filtret för den yttre frågan filtrerar rader för att visa där rangen är 1 så för varje distinkt ålder får du en rad och de ordnas slumpmässigt
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
låt anta att din förenade fråga ger dig resultaten som
Exempel på datauppsättning
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
.....
Om du nu använder den inre frågan i mitt svar får du resultatuppsättningarna med rangkolumnen enligt nedan
Inre frågeresultatuppsättning
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
Som i resultatuppsättningen ovan kan du se för ålder =1 har 3 rader och deras rangordning är olika 1,2,3 samma exempel för ålder =2 rang är 1,2 samma för ålder =4, Nu i mitt svar kommer den yttre frågan filtrera bort resultatet där rank =1 så att den slutliga resultatuppsättningen kommer att innehålla en rad för varje distinkt som se nedan resultatuppsättning
Slutlig utgång
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
Den slumpmässiga beställningsdelen görs vid den inre frågan eftersom du kan se ordningen efter del ORDER BY i.Age, RAND()
den kommer först att sortera åldern på stigande sätt och sedan för samma åldersvärden kommer den att sortera resultaten ytterligare slumpmässigt. Hoppas det är vettigt