0

このクエリを機能させるのを手伝ってもらえますか?

アクティブなユーザー (テーブル: 、ステータス: (logアクティブの場合)) ごとにログに記録されたアイテム (テーブル: ) を日別 (テーブル: 、行のない日を含む)にカウントするログ クエリがあります。user1calendar

次のクエリの実行には 10 分かかります。これを数分ではなく数秒で実行するにはどうすればよいですか?

SELECT
    c.day, COUNT(u.id) AS count
FROM calendar c
LEFT JOIN log l
    ON c.day = DATE_FORMAT(l.db_timestamp , '%Y-%m-%d')
LEFT JOIN user u
    ON l.user_id = u.id
    AND u.user_status_type_id = 1
WHERE
    c.day > '2012-12-01'
    AND c.day < '2013-01-01'
GROUP BY
    c.day

テーブル構造:

calendar (~3,000 rows)
day
===============================
2012-01-01
2012-01-02
2012-01-03
...
2020-01-01


log (~30,000 rows)
id  user_id  db_timestamp
================================
1   1        2012-01-01 01:01:01
1   2        2012-01-01 01:01:01
1   1        2012-01-01 01:01:01

user (~3,000,000 rows)
id  user_status_type_id
================================
1   1
1   0

結果は次のようになります。

Sample Expected Results
day         count
=================
2012-12-01  1
2012-12-02  0
2012-12-03  4
...
2012-12-31  0

残念ながら、実行には永遠に時間がかかります。次に何をすべきですか?

4

2 に答える 2

0

これを試してください::DATE()参加中に使用してください

 SELECT
        c.day, COUNT(u.id) AS count
    FROM calendar c
    LEFT JOIN log l
        ON c.day = DATE(l.db_timestamp)
    LEFT JOIN user u
        ON l.user_id = u.id
        AND u.user_status_type_id = 1
    WHERE
        c.day between '2013-01-01'
 AND '2012-12-01'
        GROUP BY
        c.day
于 2012-12-10T12:12:17.020 に答える
0

選択した列については、結合は必要ありません。次のSQLを使用

SELECT DATE_FORMAT(l.db_timestamp , '%Y-%m-%d') AS days, COUNT(l.id) AS COUNT 
FROM LOG l 
WHERE 
DATE_FORMAT(l.db_timestamp , '%Y-%m-%d') > '2012-12-01' 
AND DATE_FORMAT(l.db_timestamp , '%Y-%m-%d') < '2013-01-01'
GROUP BY days

ユーザーごとのカウント

使用する

GROUP BY days, l.user_id
于 2012-12-10T14:07:46.650 に答える