我该如何解构COUNT()?

时间:2010-05-21 14:33:47

标签: mysql count group-by

我有一些视图,其中有一些连接。我正在从该视图中选择COUNT(*)作为select的列之一。我对它返回的数字感到惊讶。请注意,查询从中抽取的源视图中没有GROUP BY或聚合列语句。

如何分开看看它是如何到达这个号码的呢?我在GROUP BY子句中有三列。

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(*)值相匹配?

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

4 个答案:

答案 0 :(得分:1)

这个数字令你感到惊讶的是什么?你有什么期望?你实际需要计算什么?

您的计数将是完整分组中的行数。图像,如果您想计算小时数,但按年,月和日分组。您的计数将为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

答案 1 :(得分:0)

  

如何分开看看它是如何到达这个号码的?

运行此查询:

SELECT  column1, column2, column3, COUNT(*) FROM
FROM    (
        /* View definition here */
        SELECT  …
        ) q
GROUP BY
        column1, column2, column3

并将结果与​​实际查询返回的结果进行比较。

  

我所要求的只是一种通用技术,可以查看COUNT(*)实际计算的内容

我有11年的MySQL经验,我的眼睛看到了一些可怕的东西,但我从来没有看到它不计算,尽管被告知COUNT(*)

答案 2 :(得分:0)

这样你应该得到第一个聚合的103行:

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

答案 3 :(得分:0)

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

SELECT X.*
       ,View.*
FROM (
    SELECT column1, column2, column3, COUNT(*)
    FROM View
    GROUP BY column1, column2, column3 
) AS X (column1, column2, column3, row_count)
INNER JOIN View
    ON View.column1 = X.column1
    AND View.column2 = X.column2
    AND View.column3 = X.column3
ORDER BY X.column1, X.column2, X.column3, X.row_count DESC

请注意,由于内部联接,这会产生一些NULL问题。