2016-09-02 15 views
0

SQL 2と同じ結果をSQL 1と同じにしたいが、何らかの理由でSQLクエリはWHEREに基づいて各日付の合計データ量をカウントするだけです。1つの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

関連する問題