【问题标题】:How can I use SQL_CALC_FOUND_ROWS when having multiple selects多选时如何使用 SQL_CALC_FOUND_ROWS
【发布时间】:2019-07-12 12:22:17
【问题描述】:

我正在处理使用 SQL_CALC_FOUND_ROWS() 的分页代码,但是当我将每页的结果限制为小于总结果的数字时,“SELECT FOUND_ROWS() as total”将返回每页的元素数和不是找到的行总数。由于我正在从第二个选择中进行选择,因此这个结果完全有意义,但我不知道如何解决这个问题。如何将总结果从内部传递到外部选择?

我的代码(请忽略php转义的引号):


SELECT SQL_CALC_FOUND_ROWS userid,contaTipo,userNome,nomeFantasia,sexo,cidade,estado,bairro,imovelN,logradouro,avaliacao,imagem,formasPagamento,estabelecimento,profissao 

FROM 

(SELECT vw_Busca.userid as userid, vw_Busca.contaTipo as contaTipo, vw_Busca.userNome as userNome, 
vw_Busca.nomeFantasia as nomeFantasia,vw_Busca.sexo as sexo, vw_Busca.cidade as cidade, vw_Busca.estado as estado, vw_Busca.bairro as bairro, 
vw_Busca.imovelN as imovelN,vw_Busca.logradouro as logradouro,tipoProfissionalPF.tipo as profissao, tipoProfissionalPJ.tipo as estabelecimento,
vw_userRating.total as avaliacao, GROUP_CONCAT(especialidades.especialidade SEPARATOR ', ') as especs,
vw_Busca.imagem as imagem, GROUP_CONCAT( DISTINCT userPagamento.formaPagamento SEPARATOR ', ') as formasPagamento

    FROM vw_Busca 

LEFT JOIN usersEspec ON usersEspec.userid=vw_Busca.userid 
LEFT JOIN especialidades ON especialidades.id=usersEspec.especialidade 
LEFT JOIN userPagamento ON userPagamento.userid=vw_Busca.userid 
LEFT JOIN profissionais ON profissionais.userid=vw_Busca.userid
LEFT JOIN tipoProfissionalPF ON tipoProfissionalPF.id=profissionais.profissao 
LEFT JOIN empresaDados ON empresaDados.userid=vw_Busca.userid
LEFT JOIN tipoProfissionalPJ ON tipoProfissionalPJ.id=empresaDados.tipoProfissionalPJ
LEFT JOIN vw_userRating ON vw_userRating.userid=vw_Busca.userid 

WHERE vw_Busca.cidadeId='$cidade' AND (vw_Busca.userNome LIKE '%".$termo."%' OR 
    vw_Busca.nomeFantasia LIKE '%".$termo."%' 
    OR vw_Busca.tags LIKE '%".$termo."%')

    GROUP BY userid LIMIT $inicio,$qtd) as mainTable

     ORDER BY mainTable.avaliacao DESC

【问题讨论】:

  • 你应该想办法不使用SQL_CALC_FOUND_ROWS。这是well-known performance suck。通常最好先计算行数,然后执行查询以在单独的查询中返回数据。
  • 稍后,您将遇到与JOINs、前导通配符、ORs 以及OFFSET 的使用有关的性能问题。

标签: mysql sql pagination mariadb


【解决方案1】:

您的外部选择似乎只是对内部查询返回的结果进行排序。由于您的内部查询已经应用了 LIMIT,因此您的外部查询实际上是对部分结果执行排序,这对我来说似乎不正确。所以我想你可以完全删除外部选择,这会解决你的问题。

顺便说一句,刚刚注意到 SQL_CALC_FOUND_ROWS 查询修饰符和随附的 FOUND_ROWS() 函数根据documentation从 MySQL 8.0.17 开始已弃用

【讨论】:

  • 我添加了这个外部查询,因为排序不工作,它返回错误,现在工作但是是的,正如你所说的它是部分排序。
猜你喜欢
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多