【问题标题】:Getting total mysql results returned from query with a limit: FOUND_ROWS error获取从查询返回的总 mysql 结果有限制:FOUND_ROWS 错误
【发布时间】:2012-10-06 14:13:35
【问题描述】:

我有这个 mysql 查询:

SELECT Files.GUID, Files.Name, Files.Type, Files.Visibility, Files.CreationDate, Files.OwnerUser, Date, BackupsCount
FROM Files
  LEFT JOIN (
    SELECT FileGUID, Date, COUNT(*) AS BackupsCount
    FROM Versions
    GROUP BY FileGUID
  ) Versions ON Files.GUID = Versions.FileGUID
WHERE Files.ParentFolder = '96251A8B-B2A8-416B-92D7-3509E6A645C7'
ORDER BY Files.Type DESC, CreationDate ASC
LIMIT 0, 50

我想知道这个查询会返回多少条记录如果没有 LIMIT 指令,我用 Google 搜索发现需要添加 SELECT SQL_CALC_FOUND_ROWSSELECT FOUND_ROWS();

我的问题是:我无法让它工作:

SELECT SQL_CALC_FOUND_ROWS * FROM (
SELECT Files.GUID, Files.Name, Files.Type, Files.Visibility, Files.CreationDate, Files.OwnerUser, Date, BackupsCount
FROM Files
  LEFT JOIN (
    SELECT FileGUID, Date, COUNT(*) AS BackupsCount
    FROM Versions
    GROUP BY FileGUID
  ) Versions ON Files.GUID = Versions.FileGUID
WHERE Files.ParentFolder = '96251A8B-B2A8-416B-92D7-3509E6A645C7'
ORDER BY Files.Type DESC, CreationDate ASC
LIMIT 0, 50)

-- Find total rows
SELECT FOUND_ROWS()

假设这是个好主意(我的意思是做一个查询而不是两个单独的查询),我怎样才能让 FOUND_ROWS() 处理这个查询?

【问题讨论】:

    标签: mysql join left-join limit


    【解决方案1】:

    查询应该是这样的:

    SELECT SQL_CALC_FOUND_ROWS Files.GUID, Files.Name, Files.Type, Files.Visibility, Files.CreationDate, Files.OwnerUser, Date, BackupsCount
    FROM Files
      LEFT JOIN (
        SELECT FileGUID, Date, COUNT(*) AS BackupsCount
        FROM Versions
        GROUP BY FileGUID
      ) Versions ON Files.GUID = Versions.FileGUID
    WHERE Files.ParentFolder = '96251A8B-B2A8-416B-92D7-3509E6A645C7'
    ORDER BY Files.Type DESC, CreationDate ASC
    LIMIT 0, 50
    

    【讨论】:

    • 谢谢,但查询仍然只返回行,而我需要行 总计数
    • 您可以通过执行以下操作获得计数:SELECT FOUND_ROWS() 在第一个查询之后
    【解决方案2】:

    这个想法是正确的,第二个查询几乎是瞬时的。但是你必须在SELECT之后添加关键字,没有更多:

    SELECT Files.GUID, Files.Name, Files.Type, ...
    

    变成

    SELECT SQL_CALC_FOUND_ROWS Files.GUID, Files.Name, Files.Type, ...
    

    然后将填充找到的行数,您将能够恢复它。

    如果您想运行单个 retrieval 查询,但您能够执行多个查询,那么您可以这样做(这是两个查询):

    SELECT COUNT(*) INTO @FOUNDROWS FROM ( YOUR_QUERY_WITHOUT_SELECT ) AS orig;
    

    并通过在字段中添加 @FOUNDROWS as foundrows 来更改您的检索查询:

    SELECT ...YOUR FIELDS..., @FOUNDROWS AS foundrows FROM...
    

    最后,您可以将 JOIN 作为包含两个查询的单个查询运行:

    SELECT ALL_YOUR_FIELDS, counter.FOUND_ROW_NUMBER FROM
    ( YOUR_QUERY_WITH_LIMIT ) AS limited
    JOIN ( SELECT COUNT(*) AS FOUND_ROW_NUMBER FROM YOUR_QUERY ) AS counter;
    

    【讨论】:

    • 谢谢,但我仍然需要行 总计数。我的意思是添加SELECT SQL_CALC_FOUND_ROWS 在我运行时没有显示总数
    • 不,不会的;它只存储计数,然后您必须在第二个查询中检索它。您可以在一个查询中完成,但这会花费您...我会尝试改进我的答案。
    【解决方案3】:
    A very simple example
    
    
     "SELECT SUM(final_cost) as final_cost,
    SUM(call_discount) as discount_cost,
    (SELECT COUNT(*) FROM call_records WHERE transaction_type ='call' AND account_id='$account_id' AND time_of_call>='$from' AND time_of_call<='$to' ) as calls,
    (SELECT COUNT(*) FROM call_records WHERE transaction_type ='text' AND account_id='$account_id' AND time_of_call>='$from' AND time_of_call<='$to' ) as texts,
    (SELECT COUNT(*) FROM call_records WHERE transaction_type ='appointment' AND account_id='$account_id' AND time_of_call>='$from' AND time_of_call<='$to' ) as appts
     FROM
     call_records
     WHERE account_id='$account_id'
     AND time_of_call>='$from'
     AND time_of_call<='$to' "
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 2014-02-20
      • 2019-08-22
      • 2021-02-03
      • 1970-01-01
      • 2016-03-09
      相关资源
      最近更新 更多