Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

SQL retorna 100 linhas aleatórias para cada idade


Você pode usar variáveis ​​definidas pelo usuário abaixo da consulta fornecerá um registro para cada idade distinta, a consulta interna está apenas verificando as mesmas idades e classificando-as como para 4 mesmas idades (idade =1) a classificação será 1,2,3 ,4 e quando a idade =2, o número da classificação começará de 1 novamente e onde o filtro da consulta externa está filtrando as linhas para mostrar onde a classificação é 1, portanto, para cada idade distinta, você obterá uma linha e elas serão ordenadas aleatoriamente
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

vamos supor que sua consulta combinada forneça os resultados como

Conjunto de dados de amostra

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
.....

Agora, usando a consulta interna na minha resposta, você obterá os conjuntos de resultados com a coluna de classificação como abaixo

Conjunto de resultados da consulta interna

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

Como no conjunto de resultados acima, você pode ver para idade =1 ter 3 linhas e suas classificações são diferentes 1,2,3 mesmo exemplo para idade =2 classificações são 1,2 iguais para idade =4, agora na minha resposta a consulta externa será filtre o resultado onde rank =1 para que o conjunto de resultados final contenha uma linha para cada distinto, como veja abaixo o conjunto de resultados

Resultado final

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

A parte de ordenação aleatória é feita na consulta interna, pois você pode ver a ordem por parte ORDER BY i.Age, RAND() ele primeiro ordenará a idade de maneira crescente e, em seguida, para os mesmos valores de idade, ordenará ainda mais os resultados aleatoriamente. Espero que faça sentido