合并mysql查询

问题描述

我有许多要求稍有不同的查询,这些查询将用于负载测试,因此减少查询调用的次数会更好。我认为必须有一种方法可以将查询重新排列为一个大查询。

以下是我正在使用的那种数据功能的非常简化的版本

查询1(有限情况):

    SELECT SUM(f_total_ftg>=2) as ftg_2_plus FROM 
    (SELECT * FROM results WHERE (f_player1='arcos' OR f_player2='arcos') 
    AND (f_player1='skromnuy' OR f_player2='skromnuy') 
    AND f_total_ftg IS NOT NULL AND f_datetime < '2020-07-26 00:54:00' 
    ORDER BY f_datetime DESC LIMIT 10) as x

查询2(无限制情况):

SELECT SUM(f_total_ftg>=2) as ftg_2_plus FROM 
(SELECT * FROM results WHERE (f_player1='arcos' OR f_player2='arcos') 
AND (f_player1='skromnuy' OR f_player2='skromnuy') 
AND f_total_ftg IS NOT NULL AND f_datetime < '2020-07-26 00:54:00' 
ORDER BY f_datetime DESC) as x

查询3(日期范围方案):

SELECT SUM(f_total_ftg>=2) as ftg_2_plus FROM 
(SELECT * FROM results WHERE (f_player1='arcos' OR f_player2='arcos') 
AND (f_player1='skromnuy' OR f_player2='skromnuy') 
AND f_total_ftg IS NOT NULL AND f_datetime BETWEEN '2020-07-26 00:54:00' - INTERVAL 1 DAY AND '2020-07-26 00:54:00' 
ORDER BY f_datetime DESC) as x

我不确定如何订购子查询来适应这些情况。

我想要3列:

ftg_2_plus_no_limit
ftg_2_plus_no_limit
ftg_2_plus_date_range

解决方法

您可以使用cte(公用表表达式)解决问题。

with cte_base as (
SELECT * FROM results WHERE 
    (f_player1='arcos' OR f_player2='arcos') 
    AND (f_player1='skromnuy' OR f_player2='skromnuy') 
    AND f_total_ftg IS NOT NULL
    AND f_total_ftg >=2
    ORDER BY f_datetime DESC)
SELECT (SELECT SUM(f_total_ftg) FROM cte_base 
where f_datetime < '2020-07-26 00:54:00' limit 10) as ftg_2_plus_limit,(SELECT SUM(f_total_ftg) FROM cte_base 
where f_datetime < '2020-07-26 00:54:00') as ftg_2_plus_no_limit,SELECT SUM(f_total_ftg) FROM cte_base 
where f_datetime BETWEEN '2020-07-26 00:54:00' - INTERVAL 1 DAY 
AND '2020-07-26 00:54:00') as ftg_2_plus_date_range
,

您可以在sum()上使用交叉联接和调整条件将查询合并为一个查询

select r1.ftg_2_plus_limit,sum(r.f_total_ftg>=2 and f_datetime < '2020-07-26 00:54:00') ftg_2_plus_no_limit,sum(r.f_total_ftg>=2 and f_datetime between '2020-07-26 00:54:00' - interval 1 day and '2020-07-26 00:54:00') ftg_2_plus_date_range
from results r
cross join (
    select sum(f_total_ftg>=2) ftg_2_plus_limit
    from results
    where (f_player1='arcos' or f_player2='arcos') 
        and (f_player1='skromnuy' or f_player2='skromnuy') 
        and f_total_ftg is not null
        and f_datetime < '2020-07-26 00:54:00' 
    order by f_datetime desc 
    limit 10
) r1
where (f_player1='arcos' or f_player2='arcos') 
    and (f_player1='skromnuy' or f_player2='skromnuy') 
    and f_total_ftg is not null

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...