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

时间:2011-07-19 14:15:46

标签: php mysql

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

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

使用PHP,我该怎么做呢?

tbl_products

ID 码 标题 股票 成本 RRP

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

由于

3 个答案:

答案 0 :(得分:7)

最直接的解决方案是:

SELECT  *
FROM    tbl_products
ORDER BY
        RAND()
LIMIT 1

然而,随着产品数量的增长,效率会降低。

此解决方案:

效率更高,但仍需要全表扫描。

如果产品ID的分布或多或少均匀分布,请使用:

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;

如果您在ID之间存在差距,则会更频繁地选择较大间隙后的产品。

您可以使用一个特殊的唯一列来代替id,您可以在cron作业中无间隙地填充该列。

答案 1 :(得分:1)

ORDER BY RAND()是众所周知的众所周知的解决方案。

如果产品ID是连续的整数范围并且存在非平凡的行数,那么SELECT MAX(id) FROM products会好得多,在1和PHP结果之间生成许多随机整数,并将SELECT * FROM products WHERE id IN (x, y, z)作为第二个查询。如果id几乎(但不是完全)是连续的,那么你可以调整这个解决方案以生成比所需更多的随机ID,以解释并非所有这些都可能有效(id之间的碎片越多,剩余数量越多)你应该生成)。

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

答案 2 :(得分:0)

这是一个PHP解决方案

$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 ");