Mysql 如何解构COUNT()?
我有一个观点,其中有一些观点。我正在从该视图中选择COUNT(*)作为select的一列。我对它返回的数字感到惊讶。请注意,在从中绘制查询的源代码视图中没有GROUPBY或AGGRATE column语句 我怎样才能把它拆开,看看它是如何达到这个数字的?我在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 我得到的结果是 +---------
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:对不起,我不太清楚