mysql相同结果中随机取一条_mysql取得查询结果中随机的一条数据

在项目中需要从广告表中随机选取一条未被删除的数据。最初的方法是先获取所有ID再随机选择,但发现某些广告出现概率较高。分析发现问题是删除数据影响了随机性。为解决此问题,尝试了不同的SQL查询,最终采用使用LIMIT和RAND()结合的方式,创建存储过程高效地实现了随机选取一条记录的功能。
摘要由CSDN通过智能技术生成

今天在做项目中遇到有一个需求是:随机取出广告表中的一条数据。一开始我想在程序获得所有广告ID后随机一个ID再去取对应的数据,但始终感觉这样不好。接下来我就在网上搜解决办法搜的一觉得不错方法如下:

SELECT * FROM BusinessAdvert ad WHERE  ad.Deleted<>1 AND ad.Id=(SELECT r1.id FROM BusinessAdvert AS r1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM BusinessAdvert)) AS id)AS r2 WHERE ad.Deleted<>1 AND r1.id >= r2.id ORDER BY r1.id ASC LIMIT 1)

试了几次感觉还不错,效率也挺高的。好景不长,过了两天,测试过来跟我说她感觉有些广告出现的概率特别高,我过去看了下的确是这样。下来我仔细看了下上面的代码,才发现这条语句确实有缺陷。分析如下:

代码一:SELECT ROUND(RAND() * (SELECT MAX(id) FROM BusinessAdvert)) AS id    获取0-最大广告ID之间的随机数

代码二:SELECT r1.id FROM BusinessAdvert AS r1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM BusinessAdvert)) AS id)AS r2 WHERE ad.Deleted<>1 AND r1.id >= r2.id ORDER BY r1.id ASC LIMIT 1  获取大于等于取得随机数的第一条数据

从代码一和代码二中我们可以看出如果此批数据ID是连续的则是没哟任何问题的,但如果其中有被删除的数据那删除数据之后的数据获取到的

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值