2011-11-17 12 views
0

次のタスク。 ID、UserID、Timeという3つの列を持つ表があります。これはDateTime-Typeです。今私は、次の統計情報を取得したい:私は5つの範囲持ってファジィ範囲で順序付けられた日々の値の統計情報を取得する

  • 朝(午前6時 - 11.30am)
  • 正午(11.30am - 午後)
  • 午後(午後2時を - 午後6時)
  • 夜(午後6時 - 午後10時)
  • 夜(午後10時 - 午前6時)

ユーザー持ち、一例として、次のエントリ:

ID UserID Time 
46 1  2011-11-17 17:51:24 
47 1  2011-11-17 11:41:41 
48 1  2011-11-17 07:31:20 
49 1  2011-11-17 21:41:55 
50 1  2011-11-17 21:58:28 
99 1  2011-11-18 10:12:18 

私の目標は、次の配列を取得するには、次のとおりです。

Array (
['today'] => Array (
    ['morning'] => 1, 
    ['noon'] => 1, 
    ['afternoon'] => 1, 
    ['evening'] => 2, 
    ['night'] => 0 
) 
['all'] => Array (
    ['morning'] => 2, 
    ['noon'] => 1, 
    ['afternoon'] => 1, 
    ['evening'] => 2, 
    ['night'] => 0 
) 
['avg'] => Array (
    ['morning'] => 1.5, 
    ['noon'] => 0.5, 
    ['afternoon'] => 0.5, 
    ['evening'] => 1, 
    ['night'] => 0 
) 
) 

私は本当にユーザーのすべての値の結果セットを反復処理するかどうまあ、それは動作しますしかし、私はMySQLとその日付関数を介してより簡単な方法があると確信しています。また、すべてのエントリを取ろうとしていて、時間を取得したいだけでdatetimesを取得したくない場合は、問題が発生します。私はphpの日付関数で最初にそれを解析し、時間自体を取得する必要があり、本当に有用ではありません。なぜなら、おそらくユーザIDごとに何千もの行が得られるからです。 他のタスクのために、日付自体をテーブルに保存する必要があります。

答えて

2

私は

timenames: 
id name  start  end 
1 Morning 00:06:00 11:29:59 
2 Noon  11:30:00 13:59:59 
etc... 

は次に、あなたが行うことができ、時間フィールドに、テーブルにそれらの日付範囲を置くことをお勧めしたい各タイム以内にあなたのすべてのイベントのカウントを与える必要があります

SELECT timenames.name, timenames.start, timenames.end, COUNT(users.id) 
FROM timenames 
LEFT JOIN users ON (TIME(users.`Time`) BETWEEN timenames.start AND timenames.end) 
GROUP BY timenames.id 

名前の時間範囲。

+0

これは素晴らしい作品です!どうもありがとうございました! –

0

MySQLには、PHPに似た構文CASEがあります。それを使用して、時間値に基づいて各行に識別子を与えてから、通常のGROUP関数などを使ってデータを返すことができます。

システムにSELECT/INSERT/UPDATE比が非常に高い場合は、パフォーマンスを向上させるためにデータをdenormalisingと考えてください。

+0

また、0から86400までの秒数と日付を別々に保存することも考えましたが、他の場合にはパフォーマンスも低下します。だから不幸にもオプションはありません。私はCASE構文を見ていきます。 –

関連する問題