Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL gibt 100 zufällige Zeilen für jedes Alter zurück

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