SQL优化:将四个语句合二为一

ini*_*all 3 mysql sql

我有一个包含一些列的表,其中一个包含一个时间戳,我用它来运行当前四个单选项来计算SELECT count()并返回诸如"超过1周的n行","n行超过2周"的信息,... .

如何将四个查询转换为一个希望运行得更快的SQL语句?

这些陈述如下:

SELECT count(foo_pk) AS oneweek FROM foo WHERE foo_timstamp < DATE_SUB(now(), INTERVAL 1 week)
Run Code Online (Sandbox Code Playgroud)

rsb*_*rro 5

我不是MySql的人,但在SQL Server中我会像这样使用CASE语句:

SELECT
    SUM(CASE WHEN foo_timstamp < DATE_SUB(now(), INTERVAL 1 week) THEN 1 ELSE 0 END) as oneweek,
    SUM(CASE WHEN foo_timstamp < DATE_SUB(now(), INTERVAL 2 week) THEN 1 ELSE 0 END) as twoweek,
    SUM(CASE WHEN foo_timstamp < DATE_SUB(now(), INTERVAL 3 week) THEN 1 ELSE 0 END) as threeweek,
    SUM(CASE WHEN foo_timstamp < DATE_SUB(now(), INTERVAL 4 week) THEN 1 ELSE 0 END) as fourweek
FROM foo
WHERE 
    foo_timstamp < DATE_SUB(now(), INTERVAL 1 week)
Run Code Online (Sandbox Code Playgroud)

似乎这个语句也可以在MySql中使用,所以虽然我的语法可能有些偏差,但我认为像上面的SQL这样的东西应该有效.


Mar*_*ith 5

SELECT 
      COUNT(1) AS olderthanoneweek, 
      COUNT(CASE WHEN foo_timstamp < DATE_SUB(now(), INTERVAL 2 week) THEN 1 END) AS olderthantwoweek,
      COUNT(CASE WHEN foo_timstamp < DATE_SUB(now(), INTERVAL 3 week) THEN 1 END) AS olderthanthreeweek, 
      COUNT(CASE WHEN foo_timstamp < DATE_SUB(now(), INTERVAL 4 week) THEN 1 END) AS olderthanfourweek 
FROM foo 
WHERE foo_timstamp < DATE_SUB(now(), INTERVAL 1 week)
Run Code Online (Sandbox Code Playgroud)