2016-09-02 2 views
0

Я хочу получить те же результаты в SQL 2, что и в SQL 1, но почему-то SQL-запрос учитывает только общий объем данных для каждой даты на основе WHERE.Подсчитайте разные данные из одного SQL-запроса

SQL-1 (отображает нужное количество данных на каждый день)

SELECT DATE(datetime_logged) AS date, 
COUNT(data_status) AS status_a 

FROM activity 
WHERE id_user = '1' 
AND DATE(datetime_logged) != CURDATE() 
AND data_status = 'online' 
GROUP BY DATE(datetime_logged) 
ORDER BY DATE(datetime_logged) DESC 
LIMIT 40 

result-1

SQL-2 (отображает неправильное количество данных на каждый день)

SELECT DATE(datetime_logged) AS date, 
(SELECT COUNT(data_status) 
     FROM activity 
     WHERE id_user = '1' 
     AND DATE(datetime_logged) != CURDATE() 
     AND data_status = 'online') AS status_a 

FROM activity 
GROUP BY DATE(datetime_logged) 
ORDER BY DATE(datetime_logged) DESC 
LIMIT 40 

result-2

Таблица

CREATE TABLE IF NOT EXISTS `activity` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `id_user` int(11) NOT NULL, 
    `id_channel` varchar(50) NOT NULL, 
    `id_game` int(11) NOT NULL, 
    `data_muted_server` tinyint(4) NOT NULL, 
    `data_muted_self` tinyint(4) NOT NULL, 
    `data_deafen_server` tinyint(4) NOT NULL, 
    `data_deafen_self` tinyint(4) NOT NULL, 
    `data_suppressed` tinyint(4) NOT NULL, 
    `data_status` varchar(10) NOT NULL, 
    `data_game` text, 
    `datetime_logged` datetime NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `id` (`id`), 
    KEY `index_datelog` (`datetime_logged`) 
) 

Как я могу это сделать?

ответ

0

Если я вас правильно понял, я думаю, вам просто нужно связать коррелировала подзапрос с основным запросом с:

AND a.datetime_logged=sub.datetime_logged 

Пример:

SELECT DATE(a.datetime_logged) AS date, 
(SELECT COUNT(sub.data_status) 
     FROM activity sub 
     WHERE sub.id_user = '1' 
     AND DATE(sub.datetime_logged) != CURDATE() 
     AND sub.data_status = 'online' 
     AND a.datetime_logged=sub.datetime_logged) AS status_a 

FROM activity a 
GROUP BY DATE(a.datetime_logged) 
ORDER BY DATE(a.datetime_logged) DESC 
LIMIT 40 
+0

Ваше решение работал как я хотел, но в SQL запрос замедляет работу сайта ** крайне ** много! От 0-1,5 секунд до легкости более 10 секунд. – Erik

+0

Вероятно, проблема с индексированием в поле даты. К сожалению, я не очень помогаю на mySQL. На мой взгляд, ваш первый запрос был лучшим подходом! Почему бы просто не использовать это? – JiggsJedi

+0

Хорошо. Я использовал свой подход, за исключением того, что добавил «AND DATE (a.datetime_logged) = DATE (sub.datetime_logged)» и исправил, чтобы использовать эту функциональность. – Erik

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