Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从数据库中随机选择一行的函数!_Php_Mysql - Fatal编程技术网

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

Php 从数据库中随机选择一行的函数!,php,mysql,Php,Mysql,我正在创建一个在线商店网站,需要从数据库中随机选择产品的功能 这个想法是,将有一个随机产品的广告,这是不同的网页每次加载 使用PHP,我将如何进行这项工作 tbl_产品 身份证 密码 标题 股票 费用 rrp 这些是我需要从数据库访问的行 谢谢最简单的解决方案是: SELECT * FROM tbl_products ORDER BY RAND() LIMIT 1 但是,随着产品数量的增加,这种方法的效率会降低 此解决方案: 更高效,尽管它仍然需要一个完整的表扫描

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

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

使用PHP,我将如何进行这项工作

tbl_产品

身份证 密码 标题 股票 费用 rrp

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


谢谢

最简单的解决方案是:

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作业中,您应该不间断地填充该列。

最简单的解决方案是:

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作业中不间断地填充该列。

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

如果产品id是一个连续的整数范围,并且有大量的行,那么最好是
从产品中选择MAX(id)
,在PHP中生成一个介于1和结果之间的随机整数,并将
从产品中选择*作为第二个查询,其中id位于(x,y,z)
。如果ID几乎是连续的,但不完全是连续的,那么您可以调整此解决方案以生成比所需数量更多的随机ID,以说明并非所有ID都是有效的(ID之间的碎片越多,您应该生成的多余数字就越多)

如果以上不是一个选项,那么查询仍将优于纯的
orderbyrand()

orderbyrand()
是一个众所周知的解决方案,它有着众所周知的问题

如果产品id是一个连续的整数范围,并且有大量的行,那么最好是
从产品中选择MAX(id)
,在PHP中生成一个介于1和结果之间的随机整数,并将
从产品中选择*作为第二个查询,其中id位于(x,y,z)
。如果ID几乎是连续的,但不完全是连续的,那么您可以调整此解决方案以生成比所需数量更多的随机ID,以说明并非所有ID都是有效的(ID之间的碎片越多,您应该生成的多余数字就越多)

如果以上不是一个选项,那么查询仍然比纯的
orderbyrand()更好。

这是一个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 "); 
这里有一个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 "); 

我会在库存>1的地方添加一个,并且在任何时候,库存产品的数量都不会超过500。你的解决方案能解决这个问题吗?看看为什么这可能不是最有效的方法。@Luke:只有
500
products,第一个查询就足够快了。@cWallenpole-有点困惑,我问的问题是500个产品是否足够有效!牛顿,我来看看。卡斯尼,谢谢你,巴德,我会仔细研究两种解决方案!真棒的回答:)@quassnoi-对于第二个解决方案,我将如何将WHERE stock>1合并到中?这是否可能与最大功能?我会添加一个,其中库存>1,在任何时候,库存产品的数量不会超过500。你的解决方案能解决这个问题吗?看看为什么这可能不是最有效的方法。@Luke:只有
500
products,第一个查询就足够快了。@cWallenpole-有点困惑,我问的问题是500个产品是否足够有效!牛顿,我来看看。卡斯尼,谢谢你,巴德,我会仔细研究两种解决方案!真棒的回答:)@quassnoi-对于第二个解决方案,我将如何将WHERE stock>1合并到中?使用max功能是否可能?是否尚未回答此问题?这个问题还没有得到回答吗?