2012-05-24 4 views
11

MySQL의 InnoDB 테이블에 저장된 게시물 수가 많습니다. 이 테이블에는 "id", "date", "user", "content"열이 있습니다. 나는 몇 가지 통계 그래프를 만들고 싶었다, 그래서 나는 어제의 시간 당 게시물의 양을 얻기 위해 다음 쿼리를 사용하여 종료 :MySQL의 시간당 평균 게시물은?

table data

I :

SELECT HOUR(FROM_UNIXTIME(`date`)) AS `hour`, COUNT(date) from fb_posts 
WHERE DATE(FROM_UNIXTIME(`date`)) = CURDATE() - INTERVAL 1 DAY GROUP BY hour 

이 다음 데이터가 출력을 이 쿼리를 편집하여 내가 원하는 날을 얻을 수 있습니다. 하지만 지금 내가 원하는 것은 매일 매일의 평균 시간입니다. 따라서 1 일 00 시간에 20 개의 게시물이 있고 00 일에 2 일에 40 시간이 있으면 출력이 "30"이되도록하십시오. 가능하다면 날짜 기간도 선택할 수 있기를 바랍니다.

미리 감사드립니다.

답변

6

하위 쿼리를 사용하여 데이터를 요일/시간 단위로 그룹화 한 다음 하위 쿼리에서 평균 시간 단위로 볼 수 있습니다. 여기

는 지난 7 일 동안 시간에 의해 당신에게 평균 수를 제공하는 예입니다 :

select the_hour,avg(the_count) 
from 
(
    select date(from_unixtime(`date`)) as the_day, 
    hour(from_unixtime(`date`)) as the_hour, 
    count(*) as the_count 
    from fb_posts 
    where `date` >= unix_timestamp(current_date() - interval 7 day) 
    and created_on < unix_timestamp(current_date()) 
    group by the_day,the_hour 
) s 
group by the_hour 
+0

왜 (...) 하위 쿼리 다음에 "s"를 추가합니까? –

+1

이것은 하위 쿼리의 별칭입니다.이 오류는 MySQL에서이 오류를 피하기 위해 필요합니다 :'ERROR 1248 (42000) : 모든 파생 테이블은 고유 한 별칭을 가져야합니다'. 'sub_query '와 같은 것을 원한다면 좀더 자세히 쓸 수있다. –

+0

오, 알았어요. Linoff 솔루션은 매우 유사하지만 SQL을 훨씬 더 이해하는 데 도움이되었습니다. 감사! –

0

날짜와 시간에 의한 정보를 집계 한 다음 시간 단위로 평균을 : 대부분의 데이터베이스는 그룹의 결과를 정렬하지 않기 때문에 길을, 나는에 의해 명시 적 순서를 포함하여 선호하여

select hour, avg(numposts) 
from (SELECT date(`date`) as day, HOUR(FROM_UNIXTIME(`date`)) AS `hour`, 
      count(*) as numposts 
     from fb_posts 
     WHERE DATE(FROM_UNIXTIME(`date`)) between <date1> and <date2> 
     GROUP BY date(`date`), hour 
    ) d 
group by hour 
order by 1 

으로. MySQL은 데이터베이스 하나가됩니다.

+0

성능 향상을 위해 하위 쿼리의 where 절에있는 입력 값 (날짜 열 제외)에 함수를 적용해야합니다. –

+0

또한 결과는 그룹에 의해 암시 적으로 정렬되므로 원하는 순서 인 경우 순서는 필요하지 않습니다. –

+2

이것은 mysql에 대해 사실 인 것처럼 보입니다. ANSI SQL은 결과에 따른 그룹이 정렬되지 않는다는 점에서 매우 구체적입니다 (실제로는 실제로 그렇다고하더라도). 나는 mysql이 작업을 수행 할 필요가 없다면 "order by"절을 무시할만큼 똑똑하기를 바랄 것이다. –

0
SELECT 
    HOUR(FROM_UNIXTIME(`date`)) AS `hour` 
    , COUNT(`id`) \ COUNT(DISTINCT TO_DAYS(`date`)) AS avgHourlyPostCount 
FROM fb_posts 
WHERE `date` > '2012-01-01' -- your optional date criteria 
GROUP BY hour 

이 시간에 의해, 당신에게 일수로 나눈 모든 게시물의 수를 제공합니다 .