2012-10-26 55 views
0

我有以下三个查询如何组合由相同字段组成的这些查询?

SELECT COUNT(*) as cached_type_a, DATE(datetime) as datetime 
    FROM requests 
    WHERE cached = 'a' 
    GROUP BY DAY(datetime); 

SELECT COUNT(*) as cached_type_b, DATE(datetime) as datetime 
    FROM requests 
    WHERE cached = 'b' 
    GROUP BY DAY(datetime); 

SELECT COUNT(*) as cached_type_c, DATE(datetime) as datetime 
    FROM requests 
    WHERE cached = 'c' 
    GROUP BY DAY(datetime); 

是否有可能将其与4列

cached_type_acached_type_bcached_type_cdatetime合并成一个单一的查询?

回答

1

如果只有三个cache可能的值,你可以用这个,

SELECT DATE(datetime) as datetime, 
     SUM(CASE WHEN cached = 'a' THEN 1 ELSE 0 END) cached_a, 
     SUM(CASE WHEN cached = 'b' THEN 1 ELSE 0 END) cached_b, 
     SUM(CASE WHEN cached = 'c' THEN 1 ELSE 0 END) cached_c 
FROM requests 
GROUP BY DAY(datetime) 

否则,如果您有缓存的多个号码,您可以使用Prepared Statement

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'SUM(CASE WHEN cached = ''', 
     cached, 
     ''' then 1 ELSE 0 end) AS ', 
     CONCAT('cached_',cached) 
    ) 
) INTO @sql 
FROM requests; 

SET @sql = CONCAT('SELECT DATE(datetime) as datetime, ', @sql, ' 
        FROM requests 
        GROUP BY DAY(datetime)'); 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 
+0

谢谢!有没有办法我可以用SUM(1)将每个SUM语句分开,然后再乘以100? – user784637

+0

uhmm,为什么'SUM(1)'? –

+0

它是一天中所有记录的总和,例如'SELECT DATE(datetime)as datetime,SUM(1)total,SUM(CASE WHEN cached ='a'THEN 1 ELSE 0 END)cached_a,...' – user784637

0
SELECT COUNT(a.datetime) as cached_type_a, 
     COUNT(b.datetime) as cached_type_b, 
     COUNT(c.datetime) as cached_type_c, 
     DATE(a.datetime) as datetime 
FROM requests a, 
     requests b, 
     requests c, 
WHERE a.cached = 'a' 
    and b.cached = 'b' 
    and c.cached = 'c' 
GROUP BY DAY(a.datetime), DAY(b.datetime), DAY(c.datetime); 
相关问题