我记得在某处读取使用rand()命令的顺序很糟糕,我只是对它进行了初始化并找到了证明它的文章。对于大型数据库,rand()的顺序可能非常慢,建议的解决方案是在php中生成一个随机数并根据它进行选择。问题是我需要验证其他字段才能返回我的记录。我可能还会删除一些旧记录,这也可能会导致问题。任何人都可以提供一个体面的方式从表中选择一些符合特定条件的随机记录(例如,字段paid
必须等于1)?返回随机结果(按rand()排序)
回答
你需要它们的随机程度如何?如果你不需要一个超级均匀分布试试这个
select min(pk_id) from my_table where pk_id > %(random_number)s and paid=1
其中%(random_number)s
是含有0
随机数max(pk_id)-1
绑定变量在每次运行查询
这是一个不错的主意,但我无法承担多次显示相同结果集的风险。这只会告诉人们我有一个糟糕的随机系统。 + rep –
@php_nub_qq每次执行查询时,如果您生成一个新的随机数,它将会是不同的记录 – cmd
是的我知道但我需要返回2到8个记录,我将其称为一个集合,并且如果随机数应该是max(pk_id)-8(我将它设置为最大随机数),那么将始终显示pk_id-7和pk_id-6。如果8是我需要返回的最后8个记录总是连续的。我不想运行8个单独的查询 –
,通过RAND()
排序可以之所以时间再生慢是因为在返回任何东西之前,你迫使数据库实际排序整个表。减少单个表扫描的负载要快得多(尽管仍然有点慢)。
这意味着,你可以只通过避免排序得到一部分的方式:
SELECT *
FROM my_table
WHERE RAND() < 0.1
ORDER BY RAND()
LIMIT 100
这将选择表中的所有行的1%左右,对它们进行排序,并返回前100只是请注意,这里的主要问题(以及@ cmd的答案)是您无法确定查询是否返回任何内容。
上面的方法应该包括一个完整的表扫描(决定使用哪个行),后面跟一行大约1%的行。如果您有很多行,则可以相应地减少百分比。
我需要确定我会返回一些内容,并且我需要确保返回的记录完全是随机的。如果没有更好的选择,我会使用@cmd的建议并运行一些查询。 –
但@ cmd的建议有同样的弱点 - 你不能确定它会返回任何东西。 – mzedeler
为什么不呢?我不明白它可能不会返回任何东西。 –
- 1. rand()不返回随机值
- 2. GqlQuery返回随机结果
- 3. JavaScript的对象数组排序返回随机结果
- 4. 为什么Hibernate返回随机结果?
- 5. HtmlAgilityPack和Selenium Webdriver返回随机结果
- 6. WP_Query按“rand”和“name”排序?
- 7. SQL:按列和rand()排序?
- 8. MySQL:以随机顺序返回top 16结果
- 9. TSQL RAND随机值
- 10. Array Rand不随机
- 11. 排序MySQL搜索结果返回后
- 12. 排序ASC返回奇怪的结果
- 13. 领域结果按回调排序
- 14. MySQL随机结果组按订单按
- 15. 从mysql数据库返回随机行而不使用rand()
- 16. Lucene - 返回按匹配字段数量排序的结果
- 17. Solr查询返回按'查找集合'排序的结果
- 18. 如何按id排序,只返回最近的结果
- 19. CrudRepository:返回一个结果,按列排序
- 20. MySQL按rand()排序按天分组
- 21. mysql按RAND()按降序排列
- 22. RAND没有随机顺序的限制
- 23. 使用CreateCriteria时,如何按随机顺序对结果进行排序?
- 24. 使用返回随机排一个IQueryable
- 25. 按随机顺序的新Guid排序
- 26. 按表现排序的随机顺序
- 27. SQL如果随机结果的值小于X,则返回更多随机结果,直到达到X值?
- 28. rand创建随机int
- 29. 按'流行'排序排序结果
- 30. 排序CFQUERY结果按月
如果您使用php,请使用'shuffle'功能。 所以得到你的结果,然后在你的程序中洗牌。 –
但是如果我返回了100,000个结果,我不想获取所有的结果 –
@FabianBigler将大量结果拉到php中以获得仅仅几个可能比'rand by rand()limit N'。 – Kevin