Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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 MySQL查询中是否可能有2个限制?_Php_Mysql - Fatal编程技术网

Php MySQL查询中是否可能有2个限制?

Php MySQL查询中是否可能有2个限制?,php,mysql,Php,Mysql,好的,下面是一个情况(使用PHP/MySQL),您从一个大型MySQL表中获得结果, 假设您的mysql查询返回10000个匹配结果,并且您有一个分页脚本,每页显示20个结果,您的查询可能如下所示 So第1页查询 SELECT column FROM table_name WHERE userId=1 AND somethingelse=something else LIMIT 0,20 SELECT column FROM table_name WHERE userId=1 AN

好的,下面是一个情况(使用PHP/MySQL),您从一个大型MySQL表中获得结果, 假设您的mysql查询返回10000个匹配结果,并且您有一个分页脚本,每页显示20个结果,您的查询可能如下所示

So第1页查询

SELECT column 
FROM table_name 
WHERE userId=1 
AND somethingelse=something else
LIMIT 0,20
SELECT column 
FROM table_name 
WHERE userId=1 
AND somethingelse=something else
LIMIT 20,40
So第2页查询

SELECT column 
FROM table_name 
WHERE userId=1 
AND somethingelse=something else
LIMIT 0,20
SELECT column 
FROM table_name 
WHERE userId=1 
AND somethingelse=something else
LIMIT 20,40
现在,您一次获取20个结果,但总共有10000行符合您的搜索条件

你怎么能只返回10000个结果中的3000个,而仍然在查询中限制20个,每页分页20个?

我认为这是不可能的,但myspace在浏览页面上不知怎么做到了,我知道他们没有使用php/mysql,但如何实现呢

更新


我看到一些人使用了几种方法进行了回复,似乎这些方法都不能通过将数量限制在3000来提高性能?

您可以通过子查询来实现这一点

SELECT name FROM (
   SELECT name FROM tblname LIMIT 0, 3000
) `Results` LIMIT 20, 40

或者使用临时表,将所有3000行选择到临时表中,然后按临时行id分页,这将是连续的。

首先,限制参数是偏移量和记录数,因此第二个参数应始终为20-您不需要增加此参数


当然,如果您知道要检索的行的上限,您可以将其放入运行查询的逻辑中,即检查Offset+limit您可以在php代码中将该限制指定为页码(20*p,20*p+2)的函数,并将页码的值限制为150。

如Sohnee所说,或者(取决于您的需求)您可以通过SQL获取所有3000条记录,然后使用php中的array_slice获取数组的块。

php
进行编程,这样当它发现自己准备发出一个以
LIMIT 3000、20
或更高结尾的查询时,它就会停止而不发出该查询

或者我错过了什么

更新:

MySQL
很好地对待
LIMIT
子句

除非您的查询中有
SQL\u CALC\u FOUND\u ROWS
MySQL
只要找到足够的记录满足您的查询,就会停止解析结果、排序等

当你有这样的事情时:

SELECT  column 
FROM    table_name 
WHERE   userId=1 
        AND somethingelse='something else'
LIMIT 0, 20
MySQL
将首先获取满足条件的
20
记录并停止

无论有多少条记录符合以下标准:
50
1000000
,性能都是相同的

如果您在查询中添加了一个
orderby
,但没有索引,那么
MySQL
当然需要浏览所有记录以找到第一个
20

但是,即使在这种情况下,它也不会对所有
10000
进行排序:它将有一个“运行窗口”,其中包含top
20
记录,并且只要找到一个值足够大(或小)到可以进入窗口的记录,就只在该窗口内进行排序

这比把所有的万象分类要快得多

然而,
MySQL
在管道记录方面不太好。这意味着此查询:

SELECT  column 
FROM    (
        SELECT  column
        FROM    table_name 
        WHERE   userId=1 
                AND somethingelse='something else'
        LIMIT 3000
        )
LIMIT 0, 20
在性能方面比第一个更差


MySQL
将获取
3000
记录,将它们缓存在临时表(或内存)中然后才应用外部
限制。

或者您可以使用jquery选项卡获取3000条记录,并将它们拆分为每页20条记录。

在上面的示例中,最多限制3000行并不能提高每个查询的性能。