在mysql中获取一对多关系的随机记录数

问题描述 投票:0回答:1

我有两张桌子 表A是village_info 表B是survey_info

village_info 有字段 Village_id 和 is_active

survey_info 有字段 Survey_id、survey_numbers、village_id、is_active

表中的关系是一对多 IE 每个村庄都有很多的survey_numbers

使用关系进行查询

选择 Village_info.village_id, Survey_info.survey_numbers 来自村庄信息 加入 调查信息 在 Village_info.village_id = Survey_info.village_id 其中 Village_info.is_active =1 且 Survey_info.is_active=1;

我的要求是为每个村庄获取 20 个随机调查号码

这是我的表格结构

表A:village_info 村庄_id
1
2 3 4 5

表B:survey_info Survey_numbers Village_id “12/3”1 “7/3”1 “23/4”1 “44/5”1 。 。 。 。 。 .

请求优化查询以获取每个村庄的随机 20 个 Survey_numbers,我有 Village_id 列表

我尝试了很多使用窗口函数和分组的方法,但它不是那么优化并且永远花费太多时间 该表拥有庞大的数据集,超过 2000 万个调查数据 我有给出解决方案的最后期限,请这样做,需要充分

解决方案是值得等待的回复

感谢与问候 拉梅什

我有 Village_list = [village_id1, Village_id2.......] 的列表

选择调查编号 来自调查信息 WHERE Village_id in {[village_id1, Village_id2.......] AND Survey_meta.is_active = 1 按 RAND() 限制排序

mysql performance optimization fetch
1个回答
0
投票

这就是使用窗口函数的方法:

select village_id, survey_numbers
from (
    select village_info.village_id, survey_info.survey_numbers,
        row_number() over (partition by village_info.village_id order by rand()) as rn
    from village_info
    join survey_info on village_info.village_id = survey_info.village_id
    where village_info.is_active=1 and survey_info.is_active=1
)
where rn <= 20

(如果您想要特定的村庄,请将

and village_info.village_id in (...)
添加到子查询的where子句中。)

© www.soinside.com 2019 - 2024. All rights reserved.