Możesz użyć zmiennych zdefiniowanych przez użytkownika, poniżej zapytanie da ci jeden rekord na każdy odrębny wiek, wewnętrzne zapytanie po prostu sprawdza dla tych samych grup wiekowych i nadaje im rangę jak dla 4 tych samych grup wiekowych (wiek =1) ranga wyniesie 1,2,3 ,4 i gdy wiek =2, numer rangi zacznie się ponownie od 1, a filtr zewnętrznego zapytania filtruje wiersze, aby pokazać, gdzie pozycja wynosi 1, więc dla każdego odrębnego wieku otrzymasz jeden wiersz i są one uporządkowane losowo
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
załóżmy, że połączone zapytanie daje wyniki w postaci
Przykładowy zestaw danych
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
.....
Teraz użycie wewnętrznego zapytania w mojej odpowiedzi da ci zestawy wyników z kolumną rang jak poniżej
Zestaw wyników zapytania wewnętrznego
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
Jak w powyższym zestawie wyników widać, że wiek =1 ma 3 wiersze i ich rangi są różne 1,2,3 ten sam przykład dla wieku =2 rangi to 1,2 takie same dla wieku =4, teraz w mojej odpowiedzi zewnętrzne zapytanie będzie odfiltruj wynik, gdzie pozycja =1, więc ostateczny zestaw wyników będzie zawierał po jednym wierszu dla każdego odrębnego, jak patrz poniżej zestaw wyników
Końcowe wyjście
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
Losowa część zamówienia jest wykonywana na wewnętrznym zapytaniu, ponieważ możesz zobaczyć kolejność według części ORDER BY i.Age, RAND()
najpierw uporządkuje wiek w kolejności rosnącej, a następnie dla tych samych wartości wieku uporządkuje wyniki losowo. Mam nadzieję, że to ma sens