2016-04-15 3 views
3

私は複雑な(私のために)MySQLクエリを作成してデータベースからデータを取得しようとしています。 私はデータを得るためにミックスしたい3つの列を持っています。x回以上特定のページにアクセスした人を見つけるために、このmySQLクエリを編集するには?

  1. timestamp
  2. url
  3. hash

私の最終目標は、質問のこれらの種類答えることである:

  • どのように多くをして訪問したそれらの人々が誰ですか過去の日付範囲内の特定のURLですが、そのページにアクセスする必要がありますx timesの同じ過去の日付範囲で

私がこれまでに行っているが、私は、各ハッシュ

SELECT DISTINCT hash 
    FROM behaviour 
    WHERE DATE(TIMESTAMP) BETWEEN 
    SUBDATE(CURDATE() , 2) AND CURDATE() 
    AND url = '/used-results' 

このハッシュのために2回以上発見された「URL」の合計を持ってする方法がわからない

最後の条件を追加するようにクエリを編集するにはどうすればよいですか?

+0

この優れた答えをお寄せいただきありがとうございます。 –

答えて

1

ページをカウントする場合は、ラインのどこかに集計関数が必要です。だから、:

SELECT hash 
FROM behaviour 
WHERE DATE(TIMESTAMP) BETWEEN SUBDATE(CURDATE() , 2) AND CURDATE() AND 
     url = '/used-results' 
GROUP BY hash 
HAVING COUNT(*) > 2; 

通常、このようなテーブルはかなり大きいだろうと(url, TimeStamp)にインデックスを持っているかもしれません。したがって、次のバージョンではhteインデックスをよりよく使用しています。

SELECT hash 
FROM behaviour 
WHERE url = '/used-results' AND 
     TIMESTAMP >= DATE_SUB(CURDATE(), INTERVAL 2 DAY) AND 
     TIMESTAMP < DATE_ADD(CURDATE(), INTERVAL 1 DAY)   
GROUP BY hash 
HAVING COUNT(*) > 2; 
+0

ありがとうございます。それは完全に動作します。なぜDATE(TIMESTAMP)とCURDATE()、CURDATE()の間にDATE(TIMESTAMP)を使わない方が性能が良いのですか? – villoui

+1

@villoui答えがあなたの問題を解決したら、それを受け入れてください。 – Thomas

関連する問題