2011-07-29 3 views
13

쿼리를 수행하고 모든 요일에 가입해야하지만 내 데이터베이스에는 캘린더 테이블이 없습니다.
google-ing 후 PostgreSQL에서 generate_series()을 발견했습니다. MySQL에도 비슷한 것이 있습니까?generate_series()는 MySQL에서 동일합니다

내 실제 테이블 같은 것을 가지고

date  qty 
1-1-11 3 
1-1-11 4 
4-1-11 2 
6-1-11 5 

을하지만 내 쿼리가 반환한다 :

1-1-11 7 
2-1-11 0 
3-1-11 0 
4-1-11 2 
and so on .. 
+0

왜 앱 로직 레이어에서이 작업을 수행 할 수 없습니까? – Shef

+3

앱 논리에서 '옳은'해결책이 아닙니다. 가능한 경우 SQL을 통해 수행하는 것이 더 낫습니다. 가능하지 않다면 .. 알았어요, 내 애플 리케이션 로직에서 ... – stighy

+0

@ stighly : 글쎄, 당신은 MySQL에서 문제의 절반을 해결할 수 있습니다. 즉, 당신은'GROUP BY date'와'SUM (qty) qty'를 할 수 있지만, 누락 된 시퀀스에 대한 행을 추가하기 위해 내 머리 꼭대기의 어떤 해결책도 생각 나지 않습니다. 날짜가 qty 값을 가진다면 그것을 보여주는 것이 좋습니다. 그렇지 않으면 0을 표시합니다. – Shef

답변

23

이 내가 그것을 할 방법이다. 그것은 2011-12-31 2011-01-01에 로부터 날짜의 범위를 작성

select 
    date_format(
     adddate('2011-1-1', @num:[email protected]+1), 
     '%Y-%m-%d' 
    ) date 
from 
    any_table,  
    (select @num:=-1) num 
limit 
    365 

-- use limit 366 for leap years if you're putting this in production 

유일한 요구의 행수가 any_table가 이상이어야한다는 것이다 필요한 범위의 크기 (이 예제에서는> = 365 rows). 대부분의 경우 전체 쿼리의 하위 쿼리로 사용하므로 any_table은 해당 쿼리에서 사용하는 테이블 중 하나가 될 수 있습니다.

+2

매우 해키지만, 매력처럼 작동합니다. 나는 그것을 완전히 사용하고있다. 내가 본 다른 방법보다 나아. –

+0

윤년 동안 깨지지 않습니까? – Milimetric

+0

@Milimetric No. 연속해서 365 일을 출력하지만 윤년에는 '제한 366'이 필요할 수 있습니다. – Karolis

3
은 (윤년 포함) 해 작동을 보장 @Karolis에서 솔루션의

향상된 버전 :

 
select date from (
    select 
     date_format(
     adddate('2011-1-1', @num:[email protected]+1), 
     '%Y-%m-%d' 
    ) date 
    from 
     any_table, 
    (select @num:=-1) num 
    limit 
     366 
) as dt 
where year(date)=2011 
3

나는이 솔루션에 있지만, "하드"날짜없이보고 있었다, 나는 온 - 업 이 연도는 현재 유효합니다 (answers에서 지원). 선택은 이미 날짜를 필터로

where year(date)=2011 

이 필요하지 않습니다. 또한 이렇게하면 런타임에 "계산 된"것과 같이 어떤 테이블 (최소한 테이블에 적어도 366 개의 행이있는 지 언급 한 바와 같이)이 사용되었는지 여부는 중요하지 않습니다.

select date from (
    select 
     date_format(
     adddate(MAKEDATE(year(now()),1), @num:[email protected]+1), 
     '%Y-%m-%d' 
    ) date 
    from 
     your_table, 
    (select @num:=-1) num 
    limit 
     366) as dt 
관련 문제