【问题标题】:MYSQL. SQL_CALC_FOUND_ROWS and FOUND_ROWS() are not working correctMYSQL。 SQL_CALC_FOUND_ROWS 和 FOUND_ROWS() 无法正常工作
【发布时间】:2017-03-10 22:42:03
【问题描述】:

我遇到了 MYSQL 的问题。 SQL_CALC_FOUND_ROWS 和 FOUND_ROWS() 无法正常工作。

问题:

  • 第一次总回报1
  • 第二次总返回正确 数量 3,500

MYSQL 版本:

mysql Ver 14.14 Distrib 5.7.10,适用于 osx10.9 (x86_64),使用 EditLine 包装器

我正在尝试从表中返回一个列表,并且该列表中的另一列将针对每一行重复。 (包含选择的总行数)。

这样我可以一次选择获得所有数据和总行数...

选择如下。

    SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS * FROM 
      (SELECT A.MEMBER_ID, A.USERNAME, B.ZIP, B.INTERESTS, C.ADDRESS   
       FROM MEMBER A,  DATA B, ADDRESS C        
       WHERE A.GENDER = "F" 
       AND A.MEMBER_ID = B.MEMBER_ID   
       AND A.MEMBER_ID = C.MEMBER_ID  
       AND UPPER (A.CANCEL_FLAG) = "N"      
       ORDER BY A.LAST_LOGIN_DATE DESC ) res,    
    (select FOUND_ROWS() as "total_result"  from dual ) tot    
    Limit 1, 15

【问题讨论】:

  • 1.) ORDER BY 在内部 SELECT 处是否正确,还是应该在 ORDER BY 之前结束“)”? 2.) 你有更多关于表类型和结构的信息吗?
  • 为什么它需要在 ORDER BY 之前关闭")"? 2.) ??表是基本表。我不认为他们有什么特别之处。我只是想从表中返回一个列表和另一列,它将为每一行重复......包含总行......这样我可以在一次选择中获取所有数据和总行......
  • select FOUND_ROWS() 告诉您最后一次选择找到的行数,而不是当前选择。所以你看到的是预期的结果。
  • ok.. 那么如何通过当前选择获得 found_rows() 呢?我刚刚从 Oracle 迁移,它曾经工作得很好。我想一次选择我的数据和行数。
  • 好的,明白了,您希望 SQL_CALC_FOUND_ROWS 的结果与您的数据在相同的结果中,并且您希望在每一行中都有“total_result”。不确定这是否可以使用 MySQL。我们总是使用两个不同的查询。您可以尝试使用“UNION”,但将“total_result”放在结果行中,而不是列中。

标签: mysql mysql-error-1064


【解决方案1】:

如果你想在 mysql 中进行这项工作,你可以使用COUNT 进行子查询。如果您可以假设MEMBER_ID 始终存在于DATA 和ADDRESS 中,您可以只计算MEMBER 表来使其更简单。

SELECT * FROM (
    SELECT A.MEMBER_ID, A.USERNAME, B.ZIP, B.INTERESTS, C.ADDRESS   
        FROM MEMBER A,  DATA B, ADDRESS C        
        WHERE A.GENDER = "F" 
            AND A.MEMBER_ID = B.MEMBER_ID   
            AND A.MEMBER_ID = C.MEMBER_ID  
            AND UPPER (A.CANCEL_FLAG) = "N"      
        ORDER BY A.LAST_LOGIN_DATE DESC
) res, (
    SELECT COUNT(*) as "total_result" 
        FROM MEMBER A 
            JOIN DATA B ON A.MEMBER_ID = B.MEMBER_ID 
            JOIN ADDRESS C ON A.MEMBER_ID = C.MEMBER_ID 
        WHERE A.GENDER='F'
) tot    
LIMIT 1, 15

请参阅https://www.percona.com/blog/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/ 讨论这是否可怕。

【讨论】:

  • 应该可以,但是为了得到总的结果,将整个查询加倍,对我来说看起来不是上帝。我更喜欢不同的查询。一个带有“SQL_CALC_FOUND_ROWS”和 LIMIT,另一个带有“FOUND_ROWS()”
  • 正确 - 请参阅链接以讨论哪些更有效。在实践中,“显而易见”的答案似乎不一定正确。
  • 了解 percona 的链接和研究,但是 SQL_CALC_FOUND_ROWS 看起来有点直,实际上你应该看看,使用“COUNT(*)”可以获得多少性能。
【解决方案2】:

好的。我想通了。。

我正在使用存储过程。

我刚刚做了第二次选择。 从 dual 中选择 FOUND_ROWS() 作为“total_result”;

这返回了正确的值。

谢谢 菲尔

【讨论】:

  • 这可行,但现在可以与 order by 一起使用。我正在使用 MySql 和 SQL_CALC_FOUND_ROWS。它似乎正在禁用 order by 子句。 MySql Server 版本:5.7.15-0ubuntu0.16.04.1 (Ubuntu) SELECT SQL_NO_CACHE SQL_CALC_FOUND_ROWS * FROM (禁用 ORDER BY 子句
猜你喜欢
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 2017-07-11
  • 2020-06-24
相关资源
最近更新 更多