问题描述
我有许多要求稍有不同的查询,这些查询将用于负载测试,因此减少查询调用的次数会更好。我认为必须有一种方法可以将查询重新排列为一个大查询。
以下是我正在使用的那种数据功能的非常简化的版本
查询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