mysql - 所有分组计数 (*) 的总和以及排序依据和限制(包括 fiddle)

mysql - total sum of all grouped count(*) 's with order by and limit (fiddle included)

无法弄清楚这一点...我知道下面有什么问题,但不确定如何获得我想要的结果。如果没有大量额外的重构,就不可能有两个单独的查询,我想通过这样做来避免这是一个查询......即使 TotalSum 对于集合中的每个结果都是重复的。

SELECT
    data_logs.event_target AS Name,
    COUNT(*) AS Total,
    SUM(COUNT(*)) OVER() AS TotalSum                    
FROM data_logs

GROUP BY Name
ORDER BY Total DESC
LIMIT 10

我想要的是 TotalSum 所有分组 COUNT(*) 的总数(在本例中为 10)。问题是 "windowing execution occurs before ORDER BY, LIMIT, and SELECT DISTINCT" 所以总数最终是错误的......它是所有行的总数而不是 'top 10' 我的限制。

Array
(
    [0] => Array
        (
            [Name] => somename0
            [Total] => 11
            [TotalSum] => 61
        )

    [1] => Array
        (
            [Name] => somename1 
            [Total] => 4
            [TotalSum] => 61
        )

    [2] => Array
        (
            [Name] => somename2 
            [Total] => 3
            [TotalSum] => 61
        )

    [3] => Array
        (
            [Name] => somename3 
            [Total] => 2
            [TotalSum] => 61
        )

    [4] => Array
        (
            [Name] => somename4
            [Total] => 2
            [TotalSum] => 61
        )

    [5] => Array
        (
            [Name] => somename5
            [Total] => 2
            [TotalSum] => 61
        )

    [6] => Array
        (
            [Name] => somename6 
            [Total] => 2
            [TotalSum] => 61
        )

    [7] => Array
        (
            [Name] => somename7
            [Total] => 1
            [TotalSum] => 61
        )

    [8] => Array
        (
            [Name] => somename8
            [Total] => 1
            [TotalSum] => 61
        )

    [9] => Array
        (
            [Name] => somename9
            [Total] => 1
            [TotalSum] => 61
        )

)

在上面的 [TotalSum] 中,所有这些都应该是 29...所有 10 个 [Total] 值的总和。

FIDDLE : https://www.db-fiddle.com/f/agn932Q9eXxhcm3CE26THe/2

您可以先在子查询中聚合和限制,然后计算总计:

SELECT t.*, SUM(total) OVER() AS TotalSum
FROM (
    SELECT event_target AS Name, COUNT(*) AS Total
    FROM data_logs
    GROUP BY Name
    ORDER BY Total DESC
    LIMIT 10
) t