如何在 MySQL 中重用一个巨大的查询

Yar*_*lav 1 mysql group-by subquery temp-tables common-table-expression

我有非常大的查询,它从许多表中获取数据并按所有非计算列对它们进行分组。我需要多次重用这个查询,但需要进行其他分组和过滤。在 MSSQL 中,我为此目的使用 CTE 或临时表,但 MySQL 不支持 CTE,并且我不能在同一个查询中多次引用临时表(这是 MySQL 的可悲和不合逻辑的限制)。

SELECT 
    t1.VideoId, 
    t1.RegionId, 
    t1.CountryId, 
    t1.PerCountryCount,
    t2.PerRegionCount
FROM (
    SELECT 
        VideoId, 
        RegionId, 
        CountryId, 
        SUM(PlayCount) PerCountryCount
    FROM TrackedData
    GROUP BY VideoId, RegionId, CountryId
) t1
INNER JOIN (
    SELECT 
        VideoId, 
        RegionId, 
        SUM(PlayCount) PerRegionCount
    FROM TrackedData
    GROUP BY VideoId, RegionId
) t2
Run Code Online (Sandbox Code Playgroud)

此示例已简化但显示了问题。t1 查询有更详细的数据,我想在 t2 查询中重用它,因为在实际项目中很难在 t1 查询中获取数据(百万行、许多过滤器和分组等)。我想重用这个查询的第二个原因是查询长度。我不想重复有大约 60 行代码的稍微更改的查询。

run*_*ace 5

您可以使用视图的概念重用查询:

https://dev.mysql.com/doc/refman/8.0/en/view-algorithms.html

简单的例子,在实践中big_ass_select_query可能有一堆连接

DROP VIEW IF EXISTS big_ass_select_query;

CREATE VIEW big_ass_select_query AS
SELECT col1 from table1;
Run Code Online (Sandbox Code Playgroud)

将其用作普通查询

SELECT * FROM big_ass_select_query WHERE col1 > 1;
Run Code Online (Sandbox Code Playgroud)