U kunt door de gebruiker gedefinieerde variabelen onder de query gebruiken, u krijgt één record per afzonderlijke leeftijd, de innerlijke query controleert alleen de leeftijden en geeft ze een rangorde zoals voor 4 dezelfde leeftijden (leeftijd =1). De rangorde is 1,2,3 ,4 en wanneer leeftijd =2 dan begint het rangnummer opnieuw vanaf 1 en waar het filter van de buitenste zoekopdracht rijen filtert om te laten zien waar de rang 1 is, dus voor elke afzonderlijke leeftijd krijg je één rij en ze worden willekeurig geordend
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
stel dat uw samengevoegde zoekopdracht u de resultaten geeft als
Voorbeeld dataset
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
.....
Als je nu de innerlijke vraag in mijn antwoord gebruikt, krijg je de resultatensets met de rangkolom zoals hieronder
Resultatenset binnenste zoekopdracht
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
Zoals in de bovenstaande resultatenset kun je zien dat leeftijd =1 3 rijen heeft en hun rangen zijn verschillend 1,2,3 hetzelfde voorbeeld voor leeftijd =2 rangen zijn 1,2 hetzelfde voor leeftijd =4, Nu in mijn antwoord zal de buitenste vraag filter het resultaat uit waar rang =1 zodat de uiteindelijke resultatenset één rij zal bevatten voor elke afzonderlijke, zoals zie onderstaande resultatenset
Eindresultaat
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
Het willekeurige bestelgedeelte wordt gedaan bij de innerlijke zoekopdracht, zoals u de volgorde per onderdeel kunt zien ORDER BY i.Age, RAND()
het zal eerst de leeftijd in oplopende volgorde ordenen en dan voor dezelfde leeftijdswaarden zal het de resultaten verder willekeurig ordenen. Ik hoop dat het logisch is