2015-07-28 114 views
0

我有一个SQL SELECT语句,其中包含多个连接其他独立SQL语句的多个UNION ALL关键字。如果没有UNION ALL关键字,查询太复杂了。WHERE跨越多个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) 
+0

请参考这一个http://stackoverflow.com/questions/1266666/using-union-and-count-together-in- sql-query –

+0

@AtaboyJosef这里没有讨论我的关键问题 - 如何在多个'UNION ALL'语句中使用'WHERE'子句。解决问题的方式可能相似,但问题不是。 – user3413723

回答

2

你需要做的count(*)在外部查询:

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; 

编辑:

其实,如果这些都来自同一个表,你不需要union 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; 
+0

我需要独立计算每个子查询。 – user3413723

+0

@ user3413723。 。 。这就是'group by'所做的。 –

+0

我试过两个版本。两者都可以工作,但第二个版本的速度大约快20倍! – user3413723