Mysql 其中跨越多个UNION ALL语句

Mysql 其中跨越多个UNION ALL语句,mysql,Mysql,我有一个SQL select语句,其中有多个UNION ALL关键字连接其他独立的SQL语句。如果没有UNION-ALL关键字,查询对我来说太复杂了 但是,我想将所有子查询限制在特定的日期范围内,并且我不想在每个子查询的末尾编写完全相同的where子句。有没有一种方法可以为所有这些代码编写一个WHERE子句 我尝试了下面的代码,但它不起作用,因为COUNT(*)短语阻止对每个记录过滤inputDate列。另外,从性能的角度来看,如果有办法的话,最好先按日期列进行过滤 SELECT * FROM

我有一个SQL select语句,其中有多个
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
子句。解决问题的方法可能类似,但问题并非如此。