我有一些视图,其中有一些连接。我正在从该视图中选择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(*)实际上在计算什么。
答案 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问题。