Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/276.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_Sql - Fatal编程技术网

Php 使用计数(分页)时返回不同结果的两个看似相同的查询

Php 使用计数(分页)时返回不同结果的两个看似相同的查询,php,mysql,sql,Php,Mysql,Sql,由于分页的原因,我正在对我的数据库运行两个查询。因此,每个查询几乎完全相同。My COUNT*查询未返回非计数查询的结果数。我不明白为什么会这样。查询如下 SELECT p.host_id, p.rating_support, p.rating_tech, MAX(p.rating_overall) AS rating_overall, p.publish_rating, h.name, prices.price, prices.term_duration FROM plans p INNER

由于分页的原因,我正在对我的数据库运行两个查询。因此,每个查询几乎完全相同。My COUNT*查询未返回非计数查询的结果数。我不明白为什么会这样。查询如下

SELECT p.host_id, p.rating_support, p.rating_tech, MAX(p.rating_overall) AS rating_overall, p.publish_rating, h.name, prices.price, prices.term_duration
FROM plans p
INNER JOIN hosts AS h ON h.id = p.host_id
INNER JOIN (SELECT plan_id, price, term_duration FROM prices WHERE price > 0 AND price < 50 AND term_duration = 1) prices ON prices.plan_id = p.id
WHERE p.published = 1 AND h.published = 1
GROUP BY p.host_id
ORDER BY rating_overall desc LIMIT 0, 12

SELECT COUNT(*) AS count
FROM plans p
INNER JOIN hosts AS h ON h.id = p.host_id
INNER JOIN (SELECT plan_id, price, term_duration FROM prices WHERE price > 0 AND price < 50 AND term_duration = 1) prices ON prices.plan_id = p.id
WHERE p.published = 1 AND h.published = 1
GROUP BY p.host_id
我不是MySQL的专家。除了count没有提供正确的结果数之外,non-count查询工作得非常好


任何关于这个问题的线索都会很好。

在Dems的评论的帮助下,我创建了这个查询。请注意,我删除了子查询,因为它似乎不必要:

SELECT
  COUNT( DISTINCT p.host_id )
FROM       plans p
INNER JOIN hosts h ON h.id = p.host_id
INNER JOIN prices  ON prices.plan_id = p.id
                  AND prices.price > 0
                  AND prices.price < 50
                  AND prices.term_duration = 1
WHERE p.published = 1
  AND h.published = 1
或者您可以使用SQL\u CALC\u FOUND\u ROWS+FOUND\u ROWS

SELECT语句可以包含限制子句来限制数字 服务器返回到客户端的行数。在某些情况下,情况的确如此 希望知道语句将返回多少行 没有限制,但不再次运行语句。取得 此行计数,包括选择中的SQL\u CALC\u FOUND\u ROWS选项 语句,然后在其后调用找到的\u行:

首先,只需选择所需的行,但添加SQL\u CALC\u FOUND\u行:

更新:SQL\u CALC\u FOUND\u ROWS+FOUND\u ROWS似乎不太可靠,总是因为未知的原因返回零,不仅仅是我::


第二个查询的结果将返回相同数量的行,但第一行不会返回总数

结果将给出每组每行的计数:

3
5
1
6
etc.
etc.

要将结果放在一行中,请在完整的结果集中使用PHP中的COUNTDISTINCT p.host\u id或array\u sum。

我发现您对第一个查询有限制,但对第二个查询没有限制。这可能是限制您想考虑的结果。您好,安得烈,是的,第一个查询必须限制分页原因的结果。例如,第一个页面将显示多达12个结果。第二页将显示另外12个结果,使用偏移限制。第二个查询不应受到限制,因为我们需要知道结果的完整数量,以确定我们将拥有多少页面。我的问题是,第一个查询返回6个结果,第二个查询COUNT*返回3个结果。怎么会这样?我怀疑是最大值不在计数查询中。这将消除不算数的记录。@AdrianCornish-一点也不奇怪。从表GROUP BY x中选择COUNT*将为每个不同的x值返回一行,并报告为每个不同的x值聚合了多少行数据。这就像从表组中选择x,按x计算*。因此,如果第一个查询给出6行,第二个查询也应该给出6行,结果是每个p.host_id的不同值聚合了多少行数据。@Akaishen-您的COUNT*查询具有GROUP BY p.host_id。这意味着每个p.host id的不同值返回一行。这就是为什么两个查询都返回6行。此外,COUNT*告诉您GROUP by将多少行聚合在一起以形成一个输出行。相反,COUNTdistinct p.host_id会告诉您该输出行中存在多少个p.host_id的不同值。因此,要么使用COUNTdistinct p.host_id并通过删除组,要么按照@biziclop的建议执行。使用嵌套查询来计算结果中的行数,而不是计算输入程序中的行数。。。由于原始查询是按z从y组中选择z、a、b、c,因此可以将其更改为从y组中选择COUNTdistinct z,而不使用任何GROUP BY。谢谢,这是真的!如果您从中创建答案,我将删除我自己的答案。我的答案是备选答案,而您的答案是有效答案。我不想让你删除它,所以我不打算发布我的答案。但我很高兴您能将其添加到自己的:[使用您的版本的一个原因是为了测试-您对查询所做的更改越少越好。我的建议可能会稍微快一点,也会稍微简洁一点,但您的建议会确保原始查询已经过测试,而不是类似的查询;类似意味着引入人为错误。]感谢大家清楚地解释发生了什么。我从你们的帖子中学到了很多,并将使用COUNTDISTINCT p.host\u id来获得正确的行数。我读了一些关于SQL\u CALC\u FOUND\u行的文章,并确定它不够可靠。尽管如此,我选择这个答案是因为它是最完整的g解决方案的大多数选项。感谢所有的帮助!当然-不只是-直接删除组。在您的示例中,将返回3+5+1+6+等。如果OP删除组,OP也必须使用COUNTdistinct p.host_id。请参阅我上面的评论。感谢@Jack的帖子。这是我一直在寻找的答案,尽管它包含在bizic中洛普的回答。不过,我会投赞成票给你
SELECT SQL_CALC_FOUND_ROWS
  p.host_id, p.rating_support, p.rating_tech,
  MAX(p.rating_overall) AS rating_overall,
  p.publish_rating, h.name, prices.price, prices.term_duration
FROM       plans p
INNER JOIN hosts AS h ON h.id = p.host_id
INNER JOIN prices  ON prices.plan_id = p.id
                  AND prices.price > 0
                  AND prices.price < 50
                  AND prices.term_duration = 1
WHERE p.published = 1 AND h.published = 1
GROUP BY p.host_id
ORDER BY rating_overall desc
LIMIT 0, 12;
SELECT FOUND_ROWS();
3
5
1
6
etc.
etc.