gpt4 book ai didi

php - 从没有主键的 MySQL 表中获取随机行 - 优化

转载 作者:行者123 更新时间:2023-11-30 22:57:32 24 4
gpt4 key购买 nike

所以这是我的任务:从没有主键的 MySQL 表中返回随机行。快速搜索返回 this page这个解决方案:

SELECT column FROM table
ORDER BY RAND()
LIMIT 1;

不幸的是,解决方案没有优化,如this site明确。他们建议使用 PHP 进行以下修复:

$offset_result = mysql_query( " SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `table` ");
$offset_row = mysql_fetch_object( $offset_result );
$offset = $offset_row->offset;
$result = mysql_query( " SELECT * FROM `table` LIMIT $offset, 1 " );

足够好,因为我将在页面上发布它,但与此同时我需要在原始 MySQL 中尝试它。所以我打卡了:

SELECT * 
FROM `table`
LIMIT (SELECT FLOOR(RAND() * COUNT(*)) FROM `table`), 1;

...并得到以下错误:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(SELECT FLOOR(RAND() * COUNT(*)) FROM `table`), 1' at line 3

但我不明白,因为各个组件都可以完美运行。如果我输入:

SELECT FLOOR(RAND() * COUNT(*)) 
FROM `table`

...我得到一个从 0 到行数减 1 的随机数。同样,如果我输入:

SELECT * 
FROM `table`
LIMIT 2, 1

...我得到表格中的第三行(如果我用 3 代替 2,则得到第四行,等等)

我做错了什么??提前致谢!

最佳答案

如果您想要一个随机样本,以下可能足够快:

SELECT *
FROM `table` t cross join
(select count(*) as cnt from table t) const
WHERE rand() <= 100 / cnt
ORDER BY rand()
LIMIT 1 ;

这确实需要扫描表格,但是排序是在大约 100 行上,应该足够快了。

关于php - 从没有主键的 MySQL 表中获取随机行 - 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25633501/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com