首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数据库中随机选择一行的函数!

从数据库中随机选择一行的函数!
EN

Stack Overflow用户
提问于 2011-07-19 22:15:46
回答 3查看 99关注 0票数 1

我正在创建一个在线商店网站,需要从数据库中选择随机产品的功能。

这个想法是,将有一个随机产品的广告,这是不同的每次网页加载!

使用PHP,我该怎么做呢?

tbl_products

id代码标题库存成本建议

这些是我需要从数据库访问的行。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-19 22:17:33

最简单的解决方案是:

代码语言:javascript
复制
SELECT  *
FROM    tbl_products
ORDER BY
        RAND()
LIMIT 1

然而,随着产品数量的增加,这种方法的效率会降低。

此解决方案:

效率更高,尽管它仍然需要全表扫描。

如果您的产品If或多或少是均匀分布的,请使用以下命令:

代码语言:javascript
复制
SELECT  p.*
FROM    (
        SELECT
                (
                (
                SELECT  MAX(id)
                FROM    tbl_products
                ) -
                (
                SELECT  MIN(id)
                FROM    tbl_products
                )
                ) * RAND() AS rnd
        ) q
JOIN    tbl_products p
ON      id >= rnd
ORDER BY
        id
LIMIT 1;

如果您的ids之间存在差距,则差距较大的产品将更容易被选择。

为此,您可以使用一个特殊的唯一列,而不是id,您应该在cron作业中不留空白地填充该列。

票数 7
EN

Stack Overflow用户

发布于 2011-07-19 22:26:18

ORDER BY RAND()是一个众所周知的解决方案,它有众所周知的问题。

如果产品is是一个连续的整数范围,并且有一个非平凡的行数,那么更好的方法是使用SELECT MAX(id) FROM products,生成一些介于1和PHP结果之间的随机整数,然后执行SELECT * FROM products WHERE id IN (x, y, z)作为第二个查询。如果is几乎是连续的,但不是完全连续的,那么您可以调整此解决方案,以生成比所需的更多的随机is,以说明并非所有is都是有效的(is之间的碎片越多,您应该生成的剩余数字就越多)。

如果上面不是一个选项,那么查询like this仍然比查询纯ORDER BY RAND()要好。

票数 1
EN

Stack Overflow用户

发布于 2011-07-19 22:44:02

这是一个PHP解决方案

代码语言:javascript
复制
$range_res = mysql_query( " SELECT MAX(id) AS max_id , MIN(id) AS min_id FROM products ");
$range_row = mysql_fetch_object( $range_res ); 
$random = mt_rand( $range_row->min_id , $range_row->max_id );
$res = mysql_query( " SELECT * FROM products WHERE id >= $random LIMIT 0,1 "); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6748609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档