您可以在查询下方使用用户定义的变量,每个不同年龄都会为您提供一条记录,内部查询只是检查相同年龄并为它们提供排名,就像 4 个相同年龄(年龄 = 1)排名将为 1, 2,3,4 并且当年龄 =2 时,排名号将再次从 1 开始,并且外部查询的过滤器正在过滤行以显示排名为 1 的位置,因此对于每个不同的年龄,您将得到一行并且它们随机排序
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
假设您的联合查询给您的结果为
样本数据集
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
.....
现在在我的答案中使用内部查询将为您提供具有如下排名列的结果集
内部查询结果集
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
在上面的结果集中,您可以看到年龄 = 1 有 3 行,并且它们的等级不同 1,2,3 年龄 = 2 的相同示例对于年龄 = 4 等级是 1,2 相同,现在在我的回答中外部查询将过滤掉 rank = 1 的结果,因此最终结果集将包含每个不同的一行,如下所示结果集
最终输出
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
随机排序部分是在内部查询中完成的,因为您可以看到按部分排序ORDER BY i.Age, RAND() 它会首先以升序方式对年龄进行排序,然后对于相同的年龄值,它将进一步随机排序结果。希望它有意义