Můžete použít uživatelem definované proměnné níže, dotaz vám poskytne jeden záznam pro každý odlišný věk, vnitřní dotaz pouze kontroluje stejné věkové skupiny a přiděluje jim pořadí jako pro 4 stejné věkové skupiny (věk =1) pořadí bude 1,2,3 ,4 a když věk =2, číslo pořadí začne znovu od 1 a kde filtr vnějšího dotazu filtruje řádky, aby ukázal, kde je pořadí 1, takže pro každý rozdílný věk dostanete jeden řádek a jsou seřazeny náhodně
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
předpokládejme, že váš spojený dotaz vám poskytne výsledky jako
Ukázkový soubor dat
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
.....
Nyní pomocí vnitřního dotazu v mé odpovědi získáte sady výsledků se sloupcem hodnocení, jak je uvedeno níže
Vnitřní sada výsledků dotazu
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 ve výše uvedené sadě výsledků vidíte pro věk =1 má 3 řádky a jejich pozice jsou různé 1,2,3 stejný příklad pro věk =2 pozice jsou 1,2 stejné pro věk =4, Nyní v mé odpovědi bude vnější dotaz odfiltrujte výsledek, kde pořadí =1, takže konečná sada výsledků bude obsahovat jeden řádek pro každý rozdíl, jak je uvedeno níže, sada výsledků
Konečný výstup
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
Část náhodného řazení se provádí při vnitřním dotazu, jak můžete vidět pořadí podle části ORDER BY i.Age, RAND()
nejprve seřadí věk vzestupně a poté pro stejné věkové hodnoty dále seřadí výsledky náhodně. Doufám, že to dává smysl