Mysql 如何解构COUNT()?

Mysql 如何解构COUNT()?,mysql,count,group-by,Mysql,Count,Group By,我有一个观点,其中有一些观点。我正在从该视图中选择COUNT(*)作为select的一列。我对它返回的数字感到惊讶。请注意,在从中绘制查询的源代码视图中没有GROUPBY或AGGRATE column语句 我怎样才能把它拆开,看看它是如何达到这个数字的?我在GROUPBY子句中有三列 SELECT column1, column2, column3, COUNT(*) FROM View GROUP BY column1, column2, column3 我得到的结果是 +---------

我有一个观点,其中有一些观点。我正在从该视图中选择COUNT(*)作为select的一列。我对它返回的数字感到惊讶。请注意,在从中绘制查询的源代码视图中没有GROUPBY或AGGRATE column语句

我怎样才能把它拆开,看看它是如何达到这个数字的?我在
GROUPBY
子句中有三列

SELECT column1, column2, column3, COUNT(*) FROM View GROUP BY column1, column2, column3
我得到的结果是

+---------+---------+---------+----------+
| column1 | column2 | column3 | COUNT(*) |
+---------+---------+---------+----------+
| value1  | valueA  | value_a |      103 |
+---------+---------+---------+----------+
| value2  | valueB  | value_b |       56 |
+---------+---------+---------+----------+
etc.
我想看看它是如何到达103、26等的。换句话说,我想运行一个返回103行内容的查询,这样我就知道我已经正确地表达了查询。我在仔细检查我的工作

我并不是说我认为COUNT(*)不起作用(我知道“SELECT未被破坏”),我想要重复检查的正是我在查询中表达的内容,因为我认为我表达了错误的东西,这就是为什么我会得到意外值的原因。我需要看到更多我实际指导MySQL计算的内容

那么,我应该一个接一个地测试WHERE子句中的每个值吗?换句话说,我应该怎么做

SELECT column1 FROM View WHERE column1 = 'first_grouped_value'
SELECT column1 FROM View WHERE column1 = 'second_grouped_value'
SELECT column2 FROM View WHERE column1 = 'first_grouped_value'
SELECT column2 FROM View WHERE column1 = 'second_grouped_value'
并查看返回的行计数是否与分组结果中的
count(*)
值匹配

由于机密性,我将无法发布任何查询或数据库结构。我所要求的只是一种通用的技术,看看什么是计数(*)实际上是计数

我怎样才能把它拆开,看看它是如何达到这个数字的

运行此查询:

SELECT  column1, column2, column3, COUNT(*) FROM
FROM    (
        /* View definition here */
        SELECT  …
        ) q
GROUP BY
        column1, column2, column3
并将结果与实际查询返回的结果进行比较

我所要求的只是一种通用的技术,看看什么是计数(*)实际上是计数

我有11年的
MySQL
经验,我的眼睛看到了一些可怕的事情,但我从未见过它不计数,尽管我被告知要
COUNT(*)

我怎样才能把它拆开,看看它是如何达到这个数字的

运行此查询:

SELECT  column1, column2, column3, COUNT(*) FROM
FROM    (
        /* View definition here */
        SELECT  …
        ) q
GROUP BY
        column1, column2, column3
并将结果与实际查询返回的结果进行比较

我所要求的只是一种通用的技术,看看什么是计数(*)实际上是计数


我有11年的MySQL经验,我的眼睛看到了一些可怕的事情,但我从未见过它不计数,尽管我被告知要计数(*)

你对这个数字感到惊讶的是什么?你期待什么?你到底需要计算什么

您的计数将是完整分组中的行数。如果要计算小时数,但按年、月和日分组,请使用此图像。您的计数将为24,因为这是每年每个月内每天的小时数

这些变体中的任何一个都有助于查看分组

SELECT column1, count(*)
FROM view
GROUP BY column1    

SELECT column2, count(*)
FROM view
GROUP BY column2    

SELECT column3, count(*)
FROM view
GROUP BY column3    

SELECT column1, column2, count(*)
FROM view
GROUP BY column1, column2

SELECT column2, column3, count(*)
FROM view
GROUP BY column2, column3

SELECT column1, column3, count(*)
FROM view
GROUP BY column1, column3

你对这个数字感到惊讶的是什么?你期待什么?你到底需要计算什么

您的计数将是完整分组中的行数。如果要计算小时数,但按年、月和日分组,请使用此图像。您的计数将为24,因为这是每年每个月内每天的小时数

这些变体中的任何一个都有助于查看分组

SELECT column1, count(*)
FROM view
GROUP BY column1    

SELECT column2, count(*)
FROM view
GROUP BY column2    

SELECT column3, count(*)
FROM view
GROUP BY column3    

SELECT column1, column2, count(*)
FROM view
GROUP BY column1, column2

SELECT column2, column3, count(*)
FROM view
GROUP BY column2, column3

SELECT column1, column3, count(*)
FROM view
GROUP BY column1, column3

这样,您应该从第一个聚合中获得103行:

select * from View where column1 = 'value1' and column2 = 'valueA' and column3 = 'value_a'

这样,您应该从第一个聚合中获得103行:

select * from View where column1 = 'value1' and column2 = 'valueA' and column3 = 'value_a'

这将把组显示为前3列+计数,然后是成员行的所有列(在组中没有特定顺序):


请注意,由于内部联接,这将有一些空值问题。

这将显示组的前3列+计数,然后是成员行的所有列(在组中没有特定顺序):


请注意,由于内部联接,这将有一些空值问题。

小心!随着行数的增加,带有聚合函数(如
count()
)的MySQL视图的性能非常差。这是因为使用的视图算法导致许多索引不可用。视图本身没有聚合列,但我在视图的选择中使用聚合列。这是个问题吗?您说过视图有
count(*)
所以是的,您在视图中使用了聚合函数。更多细节,彼得,我没那么说。“我正在从该视图中进行选择,其中COUNT()为列之一。”,意思是“COUNT()为该选择的列之一”。我刚刚编辑了这篇文章,让它更清晰。啊,好的,我明白了。谢谢你清理,小心点!随着行数的增加,带有聚合函数(如
count()
)的MySQL视图的性能非常差。这是因为使用的视图算法导致许多索引不可用。视图本身没有聚合列,但我在视图的选择中使用聚合列。这是个问题吗?您说过视图有
count(*)
所以是的,您在视图中使用了聚合函数。更多细节,彼得,我没那么说。“我正在从该视图中进行选择,其中COUNT()为列之一。”,意思是“COUNT()为该选择的列之一”。我刚刚编辑了这篇文章,让它更清晰。啊,好的,我明白了。谢谢你把它清理干净。这正是我现在拥有的。我想知道的是它是如何到达这些计数(*)值的。@user151841:对不起,我不太明白你的问题:)如果你不信任
MySQL
,那么,请自己计算记录,编写一个
PHP
脚本进行分组和计数。顺便说一句,您为什么不信任
计数(*)
结果?他们是不是太大,太小,什么?数字太大了。我相信计数是准确的。我不相信我在询问中所表达的。我需要了解更多我实际指导MySQL计数的内容。@用户:将存储视图替换为内联视图(如本文所示),并通过添加和删除条件来进行调试。这正是我现在拥有的。我想知道的是它是如何到达这些计数(*)值的。@user151841:对不起,我不太清楚