как деконструировать COUNT ()? - PullRequest
1 голос
/ 21 мая 2010

У меня есть вид с некоторыми объединениями. Я делаю выбор из этого представления с COUNT (*) в качестве одного из столбцов выбора. Я удивлен числом, которое это возвращает. Обратите внимание, что в исходном представлении нет ни оператора BY 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 ]

1 голос
/ 21 мая 2010

Что вас удивило в номере? Что ты ожидал? Что на самом деле нужно было рассчитать?

Ваш счет будет количеством строк в полной группировке. Изображение, если вы хотите считать часы, но сгруппированы по году, месяцу и дню. Ваш счет будет равен 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
0 голосов
/ 21 мая 2010

Это покажет группы как первые 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 из-за внутреннего соединения.

0 голосов
/ 21 мая 2010

Таким образом, вы должны получить 103 строки из первого агрегата:

select * from View where column1 = 'value1' and column2 = 'valueA' and column3 = 'value_a'
0 голосов
/ 21 мая 2010

Как я могу разобрать его, чтобы увидеть, как он приходит к этому номеру?

Запустите этот запрос:

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

и сравните результаты с тем, что возвращает ваш фактический запрос.

Все, что я прошу, - это общая техника, чтобы увидеть, что на самом деле считает COUNT (*)

У меня 11 лет MySQL опыта, и мои глаза видели некоторые ужасные вещи, но я никогда не видел, чтобы это не считалось, несмотря на то, что мне сказали COUNT(*).

...