Можете да използвате потребителски дефинирани променливи по-долу, като заявката ще ви даде по един запис за всяка отделна възраст, вътрешната заявка просто проверява за същите възрасти и им дава ранг като за 4 същите възрасти (възраст =1) рангът ще бъде 1,2,3 ,4 и когато възраст =2, тогава номерът на ранга ще започне отново от 1 и където филтърът на външната заявка филтрира редове, за да покаже къде рангът е 1, така че за всяка отделна възраст ще получите един ред и те са подредени на случаен принцип
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
да предположим, че вашата обединена заявка ви дава резултатите като
Примерен набор от данни
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
.....
Сега използването на вътрешната заявка в моя отговор ще ви даде наборите от резултати с колона за ранг, както е по-долу
Набор от резултати от вътрешна заявка
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
Както в горния набор от резултати, можете да видите за възраст =1 има 3 реда и техните рангове са различни 1,2,3 същия пример за възраст =2 ранга са 1,2 еднакви за възраст =4, Сега в моя отговор външната заявка ще филтрирайте резултата, където ранг =1, така че крайният набор от резултати ще съдържа един ред за всеки отделен, както вижте по-долу набор от резултати
Краен изход
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
Частта за произволно подреждане се извършва във вътрешната заявка, тъй като можете да видите реда по част ORDER BY i.Age, RAND()
първо ще подреди възрастта във възходящ начин и след това за същата възраст ще подреди резултатите на случаен принцип. Надявам се, че има смисъл