【问题标题】:Wrong result with FOUND_ROWS() in mySQLmySQL 中的 FOUND_ROWS() 结果错误
【发布时间】:2011-05-10 19:35:27
【问题描述】:

我总共有 6 行。当我进行查询时(比如 SELECT * from table),我有

  • LIMIT 3 => FOUND_ROWS() 给出 3 => 检索到 3 行
  • LIMIT 1, 3 => FOUND_ROWS() 给出 4 => 检索到 3 行
  • LIMIT 2, 3 => FOUND_ROWS() 给出 5 => 检索到 3 行
  • LIMIT 3, 3 => FOUND_ROWS() 给出 6 => 检索到 3 行
  • LIMIT 4, 3 => FOUND_ROWS() 给出 6 => 检索到 2 行

知道这种奇怪行为的原因是什么吗?

SQL 查询

SELECT `places`.*, `category`.*, COUNT(places_reviews.place_id) AS num_reviews, (places_popularity.rating_1 + 2*places_popularity.rating_2 + 3*places_popularity.rating_3 + 4*places_popularity.rating_4 + 5*places_popularity.rating_5)/(places_popularity.rating_1 + places_popularity.rating_2 + places_popularity.rating_3 + places_popularity.rating_4 + places_popularity.rating_5) AS average_rating, FOUND_ROWS() AS num_rows FROM (`places`) JOIN `category` ON `places`.`category_id` = `category`.`category_id` LEFT JOIN `places_reviews` ON `places_reviews`.`place_id` = `places`.`id` LEFT JOIN `places_popularity` ON `places_popularity`.`place_id` = `places`.`id` WHERE `places`.`category_id` = 1 AND `places`.`name` LIKE '%%' GROUP BY `places`.`id` ORDER BY `id` desc LIMIT 3

或者在一个块中:

SELECT `places`.*, `category`.*, 
COUNT(places_reviews.place_id) AS num_reviews, 
(places_popularity.rating_1 + 2*places_popularity.rating_2 + 3*places_popularity.rating_3 + 4*places_popularity.rating_4 + 5*places_popularity.rating_5)/(places_popularity.rating_1 + places_popularity.rating_2 + places_popularity.rating_3 + places_popularity.rating_4 + places_popularity.rating_5) AS average_rating, FOUND_ROWS() AS num_rows FROM (`places`) 
JOIN `category` ON `places`.`category_id` = `category`.`category_id` 
LEFT JOIN `places_reviews` ON `places_reviews`.`place_id` = `places`.`id` 
LEFT JOIN `places_popularity` ON `places_popularity`.`place_id` = `places`.`id` 
WHERE `places`.`category_id` = 1 
    AND `places`.`name` LIKE '%%' 
GROUP BY `places`.`id` 
ORDER BY `id` desc LIMIT 3

【问题讨论】:

  • 你能显示完整的查询吗?
  • 当然,我已经在主帖中发布了完整的 SQL 查询

标签: php mysql sql sql-calc-found-rows


【解决方案1】:

编辑:

这就是你要找的: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

所以在您的查询中:

选择 sql_calc_found_rows .....

【讨论】:

  • 我想返回不受 LIMIT 子句影响的总结果。 mysql_num_rows 会这样做吗?
【解决方案2】:

这样试试

SELECT sql_calc_found_rows `places`.*, `category`.*, 
COUNT(places_reviews.place_id) AS num_reviews, 
(places_popularity.rating_1 + 2*places_popularity.rating_2 + 3*places_popularity.rating_3 + 4*places_popularity.rating_4 + 5*places_popularity.rating_5)/(places_popularity.rating_1 + places_popularity.rating_2 + places_popularity.rating_3 + places_popularity.rating_4 + places_popularity.rating_5) AS average_rating FROM (`places`) 
JOIN `category` ON `places`.`category_id` = `category`.`category_id` 
LEFT JOIN `places_reviews` ON `places_reviews`.`place_id` = `places`.`id` 
LEFT JOIN `places_popularity` ON `places_popularity`.`place_id` = `places`.`id` 
WHERE `places`.`category_id` = 1 
    AND `places`.`name` LIKE '%%' 
GROUP BY `places`.`id` 
ORDER BY `id` desc LIMIT 3;

select found_rows();

【讨论】:

    【解决方案3】:

    最快的解决方案是像这样子查询您的实际查询:

    SELECT SQL_CALC_FOUND_ROWS * FROM (SELECT whatever FROM whatever WHERE whatever LIMIT whatever) ax; 
    select FOUND_ROWS();
    

    现在您将得到正确的结果。主要原因是SQL_CALC_FOUND_ROWS 主要跟踪找到的行(即没有LIMITS)而不是返回的行。

    【讨论】:

      猜你喜欢
      • 2012-08-27
      • 2012-10-06
      • 1970-01-01
      • 2016-03-09
      • 2016-08-04
      • 2015-08-15
      • 2014-03-16
      • 1970-01-01
      • 2021-12-21
      相关资源
      最近更新 更多