2011-04-21 5 views
1

매분마다 항목 수를 계산하고 결과를 그래프로 나타 내기 위해 mysql 쿼리를 수행하고 있습니다. 결과 출력에는 금액이 0이 아닌 시간 소인 만 표시됩니다. 이것은 내 그래프가 두 점 사이에 선을 그어 넣는 시간에 잘못된 결과를주는 원인이되고 있습니다. 나는 분과 가치의 수를 돌려주고 싶다.timeperiod 그룹은 0이 아닌 합계 만 표시합니다.

루프를 수행하거나 여러 쿼리를 수행하지 않고도이 쿼리를 작성할 수 있습니까? 또는 루프가 필요한 경우 두 개의 타임 스탬프 사이에 매분마다 루프를 돌리는 쉬운 방법이 있습니까?

SELECT UNIX_TIMESTAMP(timestamp) AS timestamp, count(*) AS total 
FROM table 
WHERE timestamp <= '2011-04-22 11:00' AND timestamp >= '2011-04-20 10:00' 
GROUP BY MINUTE(timestamp) 

답변

0

싶은 것은 "집계"또는 "번호"테이블을 사용할 수 있습니다 :

이 내 쿼리입니다. 기본적으로 숫자가 1에서 매우 큰 숫자까지 하나의 정수 열이있는 테이블을 만듭니다. 따라서 집계 테이블에 1000 개의 레코드가있는 경우 1부터 1000까지의 숫자가 테이블에 있습니다. 1000보다 많은 숫자를 넣으시겠습니까?하지만 잘하면 아이디어를 얻을 수 있습니다.

numtablevalue이 (분) 1 enddate - startdate 사이입니다 당신이 당신의 집계 테이블 (스크립트에 대한 here 클릭)가되면, 당신은 당신의 쿼리로를 선택합니다. 그런 다음 그룹을 startdate + numtablevalue까지 지정하십시오.

그래서 (의사 SQL)과 같이 작동합니다 :

SELECT 'startdate' + INTERVAL tt.id MINUTE, COUNT(t1.timestampfield) 
FROM tallytable AS tt 
INNER JOIN 
table AS t1 
ON 'startdate' + INTERVAL tt.id MINUTE = t1.timestampfield 
WHERE 
tt.id BETWEEN 1 AND GETMINUTES('enddate' - 'begindate') 
GROUP BY 'startdate' + INTERVAL tt.id MINUTE 

을 기본적으로 우리는 두 날짜 사이의 시간 (초)에 1부터 숫자를 선택하고 있습니다. 그런 다음 startdate + tt.id을 사용하여 날짜 사이의 각 초를 가져옵니다. 그런 다음 숫자 테이블을 사용하여 선택한 각 분에 속하는 t1의 레코드 수를 찾아서 그룹화합니다. 나는 이것이 의미가 있기를 바랍니다. (> = STARTDATE 반대)이이> STARTDATE를 시간을 얻을 것이다

  • 당신의 타임 스탬프가 5:12 PM 때문에 그와 관련된 초이있는 경우
  • 조심 :

    당신이주의 할 수있는 몇 가지가있다 5:12:30 PM

0
select i.`minute`,count(minute(timestamp)) as total from (
select tmp.digit + tmp2.digit * 10 as `minute` 
from (
select 0 as digit union all 
select 1 union all 
select 2 union all 
select 3 union all 
select 4 union all 
select 5 union all 
select 6 union all 
select 7 union all 
select 8 union all 
select 9 
) as tmp 
cross join (
select 0 as digit union all 
select 1 union all 
select 2 union all 
select 3 union all 
select 4 union all 
select 5 
) as tmp2) as i 
left join table 
on minute(tb.timestamp) = i.`minute` 
and timestamp between '2011-04-20 10:00' and '2011-04-22 11:00' 
group by i.`minute` 

로 같지 않을 수도 조회하면 각 minut 60 개 레코드의 총 개수 (0 ~ 59 분)을 수득 할 e 정수 값을 저장할 다른 테이블을 만들지 않고.

+0

타임 스탬프는 단지 60 분이 아니라 2 일 및 1 시간에 걸쳐 있습니다. –

+0

@Drackir : 그러나 OP의 쿼리는 그들을 60 분으로 그룹화합니다. 실제로 OP의 쿼리는 분 단위로 그룹화되었지만 개별 타임 스탬프 값을 선택하기 때문에 애매합니다 (비 결정적입니다). –

관련 문제