2011-11-17 1 views
0

다음 작업; ID, UserID 및 Time, DateTime-Type 인 3 개의 열이있는 테이블이 있습니다. 지금은 다음과 같은 통계를 얻으려면 : 나는 5 개 범위에있어매일 값의 통계를 퍼지 범위로 정렬하기

:

  • 아침 (오전 6시에서 오전 11시 반 사이)
  • 정오 (오전 11시 30분부터 오후 2시까지)
  • 오후 (오후 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 date 함수를 통해 먼저 구문 분석해야하고 시간 자체를 얻는 것은 정말 유용하지 않습니다. 왜냐하면 아마 userid 당 몇 줄의 줄을 얻을 수 있기 때문입니다. 날짜 자체는 다른 작업을 위해 테이블에 저장되어야합니다.

답변

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까지의 초와 날짜를 seperatly로 저장하는 것에 대해 생각했지만, 다른 경우에는 성능이 저하 될 수도 있습니다. 그래서 불행히도 옵션이 아닙니다. 나는 CASE 구문을 살펴볼 것이다. –