如何基于zip code列对user表抽取的100条数据做随机排序?
实现方案
以下是主流数据库的实现逻辑,均遵循「先取100条数据,再基于zip code字段随机排序」的要求:
MySQL
方案1:基于zip code作为随机种子(推荐)
相同zip code的记录每次生成的随机值固定,排序结果可复现:
SELECT * FROM ( SELECT * FROM user LIMIT 100 ) AS sub_100_users ORDER BY RAND(zip_code);
方案2:哈希排序
如果需要相同zip code的记录排在相邻位置,使用哈希运算排序:
SELECT * FROM ( SELECT * FROM user LIMIT 100 ) AS sub_100_users ORDER BY MD5(zip_code);
PostgreSQL
方案1:基于zip code作为随机种子
SELECT * FROM ( SELECT * FROM "user" LIMIT 100 ) AS sub_100_users ORDER BY SETSEED(zip_code::numeric/1000000), RANDOM();
方案2:哈希排序
SELECT * FROM ( SELECT * FROM "user" LIMIT 100 ) AS sub_100_users ORDER BY MD5(zip_code::text);
SQL Server
方案1:哈希+随机ID排序
SELECT * FROM ( SELECT TOP 100 * FROM [user] ) AS sub_100_users ORDER BY HASHBYTES('MD5', CONVERT(VARCHAR(255), zip_code)), NEWID();
注意事项
- 如果需要完全打乱所有记录,且同一个zip code的记录排序位置每次都不变,仅保留哈希排序或者种子随机排序的逻辑即可
- 如果需要同一个zip code下的记录也随机打乱,在排序规则后面追加数据库对应的原生随机函数即可(MySQL加
RAND(),PostgreSQL加RANDOM(),SQL Server加NEWID())
内容的提问来源于stack exchange,提问作者zia sultan
相关产品推荐
相关产品推荐

