获取从查询返回的总mysql结果时有一个限制:FOUND\u ROWS错误

获取从查询返回的总mysql结果时有一个限制:FOUND\u ROWS错误,mysql,join,left-join,limit,Mysql,Join,Left Join,Limit,我有一个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 )

我有一个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指令不存在,这个查询将返回多少条记录,我在谷歌上搜索发现我需要添加SELECT SQL\u CALC\u found\u行和SELECT found\u行

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

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()

假设这是一个好主意,我的意思是执行一个查询而不是两个单独的查询,我如何才能让找到的行处理此查询?

查询应如下所示:

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 Files.GUID, Files.Name, Files.Type, ...
变成

SELECT SQL_CALC_FOUND_ROWS Files.GUID, Files.Name, Files.Type, ...
然后将填充找到的行数,您将能够恢复它

如果要运行单个检索查询,但可以执行多个查询,则可以执行两个查询:

SELECT COUNT(*) INTO @FOUNDROWS FROM ( YOUR_QUERY_WITHOUT_SELECT ) AS orig;
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;
并通过将@FOUNDROWS作为FOUNDROWS添加到字段来更改检索查询:

SELECT ...YOUR FIELDS..., @FOUNDROWS AS foundrows FROM...
最后,您可以将联接作为包含以下两个查询的单个查询运行:

SELECT COUNT(*) INTO @FOUNDROWS FROM ( YOUR_QUERY_WITHOUT_SELECT ) AS orig;
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\u CALC\u FOUND\u行在我运行它时没有显示总计数否,它不会;它只存储计数,然后您必须在第二个查询中检索它。您可以在一个查询中完成,但这将花费您。。。我会努力改进我的答案。