2016-12-17 86 views
0

我在這裏已經嘗試過,但我不能,我只能顯示總。如何從1到5天集團選擇數據通過

我有一個下載表和節目表。

每次我下載一個程序我記錄日期和時間,我需要做下載的程序進行分組,然後5列與日期,這裏是一個例子。

PROGRAMA | HOJE | ONTEM| 2 DIAS | 3 DIAS | 4 DIAS 

Programa 1  11  110  55  66  12 
Programa 2  25  140  60  90  12 
Programa 3  10  20  20  10  10 
TOTAL   46  270  135  166  32 

下面是我的查詢

select `k`.`app_id` AS `app_id`,`b`.`aplicativo` AS `aplicativo`,count(0) AS `HOJE`, 

(select count(0) AS `count(*)` from (`registration` `a` join `aplicativos` `b`) where `k`.`app_id`= `b`.`id` and created_at > (cast(now() as date) - interval 1 day) and (`a`.`created_at` < cast(now() as date)- interval 0 day)) as ONTEM , 

(select count(0) AS `count(*)` from (`registration` `a` join `aplicativos` `b`) where `k`.`app_id` = `b`.`id` 
and created_at > (cast(now() as date) - interval 2 day) and (`a`.`created_at` < cast(now() as date)- interval 1 day)) as 2_DIAS_ANTES , 

(select count(0) AS `count(*)` from (`registration` `a` join `aplicativos` `b`) where `k`.`app_id` = `b`.`id` 
and created_at > (cast(now() as date) - interval 3 day) and (`a`.`created_at` < cast(now() as date)- interval 2 day)) as 3_DIAS_ANTES , 

(select count(0) AS `count(*)` from (`registration` `a` join `aplicativos` `b`) where `k`.`app_id` = `b`.`id` 
and created_at > (cast(now() as date) - interval 4 day) and (`a`.`created_at` < cast(now() as date)- interval 3 day)) as 4_DIAS_ANTES , 

(select count(0) AS `count(*)` from (`registration` `a` join `aplicativos` `b`) where `k`.`app_id` = `b`.`id` 
and created_at > (cast(now() as date) - interval 5 day) and (`a`.`created_at` < cast(now() as date)- interval 4 day)) as 5_DIAS_ANTES 


from (`registration` `k` join `aplicativos` `b`) where ((`k`.`app_id` = `b`.`id`) and (`k`.`created_at` > (cast(now() as date) - interval 0 day))) 

group by `b`.`aplicativo` 

表結構

表aplicativos

CREATE TABLE IF NOT EXISTS `aplicativos` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `id_usuario` int(11) NOT NULL, 
    `aplicativo` varchar(200) NOT NULL, 
    `link` varchar(400) NOT NULL, 
    `quantidade_notificacoes` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ; 

表登記

CREATE TABLE IF NOT EXISTS `registration` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `gcm_regid` varchar(300) NOT NULL, 
    `app_id` int(11) NOT NULL, 
    `email` varchar(200) NOT NULL, 
    `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=73876 ; 
+0

¿你可以張貼的表結構? –

+0

你好朋友,我發佈了結構,如果你需要其他的東西讓我知道。幾乎 – William

回答

1

下面是MySQL的一種方法:

SELECT a.aplicativo as PROGRAMA, 
     sum(Date(r.created_at) = CURDATE()) AS HOJE, 
     sum(date(r.created_at) = DATE_SUB(CURDATE(), INTERVAL 1 DAY), 1, 0)) AS ONTEM, 
     ... 
FROM registration r INNER JOIN 
    aplicativos a 
    on r.app_id = a.id 
GROUP BY r.app_id ; 
+0

Gordon Linoff,PERFECT!有效。你知道我怎麼能把每週的每一天放在每一列嗎?昨天的例子是星期五的星期五顯示嗎? – William

+0

我試圖這樣 - ,DATE_FORMAT(CURDATE() - 1, '%D-%米原子%的Hh%I') 但它給錯誤 – William

+0

@William。 。 。包括一週中的某一天,我不知道你的意思。你能否用樣本數據和期望的結果提出另一個問題? –

1

這是否給你預期的結果?

SELECT 
a.aplicativo as PROGRAMA, 
COUNT(IF(DATE(r.created_at) = CURDATE(), 1, 0)) AS HOJE, 
COUNT(IF(DATE(r.created_at) = DATE_SUB(CURDATE(), INTERVAL 1 DAY), 1, 0)) AS ONTEM, 
COUNT(IF(DATE(r.created_at) = DATE_SUB(CURDATE(), INTERVAL 2 DAY), 1, 0)) AS 2DIAS, 
COUNT(IF(DATE(r.created_at) = DATE_SUB(CURDATE(), INTERVAL 3 DAY), 1, 0)) AS 3DIAS, 
COUNT(IF(DATE(r.created_at) = DATE_SUB(CURDATE(), INTERVAL 4 DAY), 1, 0)) AS 4DIAS, 
COUNT(IF(DATE(r.created_at) = DATE_SUB(CURDATE(), INTERVAL 5 DAY), 1, 0)) AS 5DIAS 
FROM registration r 
INNER JOIN aplicativos a 
ON r.app_id = a.id 
GROUP BY r.app_id, DATE(r.created_at) with ROLLUP; 
+0

這一點,但帶來了同樣的結果https://postimg.org/image/ep1162327/ – William

+0

MySQL服務器版本使用附近「(r.created_at)GROUP BY r.app_id與ROLLUP LIMIT 0,100」正確的語法 – William

+0

即使刪除「DATE(r.created_at)」查詢,也會在天內繼續處理重複數據。 每個節目每個節目總共有不同的總數 – William