Sie können benutzerdefinierte Variablen unten verwenden. Die Abfrage gibt Ihnen einen Datensatz für jedes unterschiedliche Alter. Die innere Abfrage prüft nur die gleichen Altersgruppen und gibt ihnen einen Rang, z. B. für 4 gleiche Altersgruppen (Alter =1) ist der Rang 1,2,3 ,4 und wenn das Alter =2 ist, beginnt die Rangnummer wieder bei 1 und wobei der Filter der äußeren Abfrage Zeilen filtert, um anzuzeigen, wo der Rang 1 ist, sodass Sie für jedes unterschiedliche Alter eine Zeile erhalten und diese zufällig geordnet sind
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
Nehmen wir an, Ihre verbundene Abfrage gibt Ihnen die Ergebnisse als
Beispieldatensatz
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
.....
Wenn Sie jetzt die innere Abfrage in meiner Antwort verwenden, erhalten Sie die Ergebnissätze mit der Rangspalte wie unten
Innere Abfrageergebnismenge
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
Wie im obigen Ergebnissatz können Sie sehen, dass für Alter =1 3 Zeilen vorhanden sind und ihre Ränge unterschiedlich sind. 1,2,3. Gleiches Beispiel für Alter =2. Ränge sind 1,2. Gleich für Alter =4. Jetzt wird in meiner Antwort die äußere Abfrage angezeigt Filtern Sie das Ergebnis mit Rang =1 heraus, sodass die endgültige Ergebnismenge eine Zeile für jeden Distinct enthält, wie unten in der Ergebnismenge zu sehen ist
Endgültige Ausgabe
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
Der zufällige Sortierteil wird bei der inneren Abfrage durchgeführt, wie Sie die Reihenfolge nach Teil sehen können ORDER BY i.Age, RAND()
Es wird zuerst das Alter aufsteigend ordnen und dann für gleiche Alterswerte die Ergebnisse nach dem Zufallsprinzip weiter ordnen. Ich hoffe, es macht Sinn