sql >> Database >  >> RDS >> Mysql

SQL retourneert 100 willekeurige rijen voor elke leeftijd

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



  1. MySQL:werk alle rijen in een tabel bij die overeenkomen met de resultaten van een andere zoekopdracht

  2. gegevens uit database weergeven in vervolgkeuzelijst CodeIgniter

  3. Hoe alleen datum en jaar te vergelijken in php codeigniter

  4. De eerste html-rij wordt niet weergegeven