Mysql 其中跨越多个UNION ALL语句
我有一个SQL select语句,其中有多个Mysql 其中跨越多个UNION ALL语句,mysql,Mysql,我有一个SQL select语句,其中有多个UNION ALL关键字连接其他独立的SQL语句。如果没有UNION-ALL关键字,查询对我来说太复杂了 但是,我想将所有子查询限制在特定的日期范围内,并且我不想在每个子查询的末尾编写完全相同的where子句。有没有一种方法可以为所有这些代码编写一个WHERE子句 我尝试了下面的代码,但它不起作用,因为COUNT(*)短语阻止对每个记录过滤inputDate列。另外,从性能的角度来看,如果有办法的话,最好先按日期列进行过滤 SELECT * FROM
UNION ALL
关键字连接其他独立的SQL语句。如果没有UNION-ALL
关键字,查询对我来说太复杂了
但是,我想将所有子查询限制在特定的日期范围内,并且我不想在每个子查询的末尾编写完全相同的where子句。有没有一种方法可以为所有这些代码编写一个WHERE
子句
我尝试了下面的代码,但它不起作用,因为COUNT(*)
短语阻止对每个记录过滤inputDate
列。另外,从性能的角度来看,如果有办法的话,最好先按日期列进行过滤
SELECT * FROM (
SELECT count(*), inputDate 'sel1' as name FROM tblName WHERE name IN ('n1','n2')
UNION ALL
SELECT count(*), inputDate, 'sel2' as name FROM tblName WHERE name IN ('n3','n4')
UNION ALL
SELECT count(*), inputDate, 'sel3' as name FROM tblName WHERE name IN ('n5','n6')
) names WHERE inputDate >= DATE_SUB(NOW(), INTERVAL 1 MONTH)
您需要在外部查询中执行
计数(*)
:
SELECT name, count(*), inputdate
FROM (SELECT inputDate, 'sel1' as name FROM tblName WHERE name IN ('n1','n2')
UNION ALL
SELECT inputDate, 'sel2' as name FROM tblName WHERE name IN ('n3','n4')
UNION ALL
SELECT inputDate, 'sel3' as name FROM tblName WHERE name IN ('n5','n6')
) names
WHERE inputDate >= DATE_SUB(NOW(), INTERVAL 1 MONTH)
GROUP BY name;
编辑:
实际上,如果这些都来自同一个表,则不需要使用联合all
:
select (case when name in ('n1', 'n2') then 'sel1'
when name in ('n3', 'n4') then 'sel2'
when name in ('n5', 'n6') then 'sel3'
end) as grp, count(*)
from tblName
where inputDate >= DATE_SUB(NOW(), INTERVAL 1 MONTH) and
name in ('n1', 'n2', 'n3', 'n4',' n5', 'n6')
group by grp;
我需要独立计算每个子查询。@user3413723。这就是
groupby
所做的。我尝试了两个版本。两者都可以,但是第二个版本快了20倍!请参考这里没有讨论我的关键问题的@AtaboyJosef,即如何在多个UNION ALL
语句上使用WHERE
子句。解决问题的方法可能类似,但问题并非如此。