2016-12-17 2 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-% m at% 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

Смежные вопросы