Mysql 如何修复带有“GROUPBY”子句的查询中的count()?

Mysql 如何修复带有“GROUPBY”子句的查询中的count()?,mysql,sql,delphi,zeos,Mysql,Sql,Delphi,Zeos,我有一个函数,它获取SQL代码并在其中插入一个count字段,然后执行查询以返回其中的行数。我们的目标是拥有一个动态SQL代码,并且无论它有什么代码,都能够获得它的记录计数,因为我在注册表过滤器窗口中使用它,而且我永远不知道会生成什么代码,因为用户可以添加他/她想要的任意多个过滤器 但是当我使用GROUPBY子句时,结果是错误的,因为它正在计算主注册表出现的次数,因为它在许多连接上使用 上面代码的结果应该只有一行,列的结果是10,但是我得到了一个新表,第一行的第一列是2,其他行是1 如果我去掉G

我有一个函数,它获取SQL代码并在其中插入一个count字段,然后执行查询以返回其中的行数。我们的目标是拥有一个动态SQL代码,并且无论它有什么代码,都能够获得它的记录计数,因为我在注册表过滤器窗口中使用它,而且我永远不知道会生成什么代码,因为用户可以添加他/她想要的任意多个过滤器

但是当我使用GROUPBY子句时,结果是错误的,因为它正在计算主注册表出现的次数,因为它在许多连接上使用

上面代码的结果应该只有一行,列的结果是10,但是我得到了一个新表,第一行的第一列是2,其他行是1

如果我去掉GROUPBY子句,我将收到一个11作为计数结果,但是第一行将被计数两次

我应该怎么做才能得到一行和正确的数字

SELECT 
 COUNT(*) QUERYRECORDCOUNT, // this line appears only in the Count() function 
 ARTISTA.*,
 CATEGORIA.NOME AS CATEGORIA,
 ATIVIDADE.NOME AS ATIVIDADE,
 LOCALIDADE.NOME AS CIDADE,
 MATRICULA.NUMERO AS MAP

FROM
 ARTISTA
 LEFT JOIN PERFIL ON PERFIL.REGISTRO = ARTISTA.ARTISTA_ID
 LEFT JOIN CATEGORIA ON CATEGORIA.CATEGORIA_ID = PERFIL.CATEGORIA
 LEFT JOIN ATIVIDADE ON ATIVIDADE.ATIVIDADE_ID = PERFIL.ATIVIDADE
 LEFT JOIN LOCALIDADE ON LOCALIDADE.LOCALIDADE_ID = ARTISTA.LOCAL_ATIV_CIDADE
 LEFT JOIN MATRICULA ON MATRICULA.REGISTRO = ARTISTA.ARTISTA_ID

WHERE 
 ((ARTISTA.SIT_PERFIL <> 'NORMAL') AND (ARTISTA.SIT_PERFIL <> 'PRIVADO'))
GROUP BY
 ARTISTA.ARTISTA_ID
ORDER BY 
 ARTISTA.ARTISTA_ID;

这始终为您提供任何查询的行数:

Select count(*) as rowcount from
(

     Paste your query here

) as countquery

由于您是按ARTISTA.ARTISTA_ID分组的,COUNT*QUERYRECORDCOUNT将返回每个ARTISTA.ARTISTA_ID值的记录计数

如果需要全局计数,则需要使用嵌套查询:

SELECT COUNT(*) AS QUERYRECORDCOUNT 
    FROM (SELECT 
     ARTISTA.*,
     CATEGORIA.NOME AS CATEGORIA,
     ATIVIDADE.NOME AS ATIVIDADE,
     LOCALIDADE.NOME AS CIDADE,
     MATRICULA.NUMERO AS MAP

    FROM
     ARTISTA
     LEFT JOIN PERFIL ON PERFIL.REGISTRO = ARTISTA.ARTISTA_ID
     LEFT JOIN CATEGORIA ON CATEGORIA.CATEGORIA_ID = PERFIL.CATEGORIA
     LEFT JOIN ATIVIDADE ON ATIVIDADE.ATIVIDADE_ID = PERFIL.ATIVIDADE
     LEFT JOIN LOCALIDADE ON LOCALIDADE.LOCALIDADE_ID = ARTISTA.LOCAL_ATIV_CIDADE
     LEFT JOIN MATRICULA ON MATRICULA.REGISTRO = ARTISTA.ARTISTA_ID

    WHERE 
     ((ARTISTA.SIT_PERFIL <> 'NORMAL') AND (ARTISTA.SIT_PERFIL <> 'PRIVADO'))
    GROUP BY
     ARTISTA.ARTISTA_ID
    ORDER BY 
     ARTISTA.ARTISTA_ID);
在这种情况下,您可能不需要选择那么多列


如果需要检索包含详细信息的所有记录计数,最好使用两个单独的查询。

如果建议使用COUNTDISTINCT ARTISTA.ARTISTA_ID并删除所有联接,则效率不高。在这种情况下,以适当的方式重写查询是有意义的,而不仅仅是盲目地用您提出的内容包装查询。所以,我个人不推荐你的解决方案,你可以重写你的查询。只需添加count*并按删除组。我只是提供了一个解决方案,它应该总是有效的,如果你只想知道你将得到多少条记录,它不要求你重写你的查询。如果你只想知道你将得到多少条记录,它也不要求你重写你的查询,这是非常低效的。没有理由保留查询中不影响结果的部分。嗯,这可能会非常低效。当结果是这样的时候,做点什么。在那之前,我们谈论的是过早优化,实际上不是。在此之前,我们讨论的是毫无意义的查询。这不是一个优化,而是关于你查询的内容。如果你不需要,为什么要离开加入?您是否也在代码中添加一些随机片段到查询中只是为了好玩?如果您总是离开JOIN,您只需从ARTISTA中选择COUNT*,其中。。。不选择额外的行和额外的连接。问题是,我的函数将接收包含任意数量的字段和连接的SQL代码,并且它必须更改SQL以使计数的结果与未更改时的结果相同。