database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 29626 게시물 읽기
No. 29626
수정된 글 올렸습니다. mysql 기간 검색입니다. 도와주세요. ㅠㅠ [급박]
작성자
바램
작성일
2010-04-22 11:31ⓒ
2010-05-12 09:53ⓜ
조회수
9,940

테이블 1입니다.
 h
 0
 1
 2
 3
 
테이블 2입니다.
 id  sdate   edate   idate
a  201003300  201003301  201003300
a  201003301  201003302  201003301
a  201003302  201003303  201003302
a  201003303  201003300  201003303
a  201003310  201003311  201003310
a  201003311  201003312  201003311
a  201003312  201003313  201003312
a   201003313  201003310  201003313
 
테이블 3입니다.
 id  pw  ip
 a  ***   127.0.0.1
 b  ***  127.0.0.1
 c  ***  127.0.0.1
 
테이블 1을 기준으로 매시간마다 들어온 데이터가 누락되었는지 누락되지 않았는지를 날짜 검색하려고 합니다.
만약 테이블 2에서 sdate 컬럼의 20100301과 201003312의 컬럼이 빈 컬럼으로 나타났을 때
  id  sdate   edate    idate
 a  201003300  201003301  201003300
 a  201003302  201003303  201003302
 a  201003303  201003300  201003303
 a  201003310  201003311  201003310
 a  201003311  201003312  201003311
 a  201003313  201003310  201003313
현재 테이블의 데이터가 위와 같다면
 
SELECT
        IFNULL(CONCAT(
       CAST(sdate AS CHAR)
      , '분 ~ '
      , CAST(edate AS CHAR)
      , '분'), '누락') TI 
   , IFNULL(CAST(idate AS CHAR), '누락') INDI
   , IFNULL(CONCAT(
                   SUBSTRING(idate, 1,4)
                 , '년'
                 ,  SUBSTRING(idate, 5,2)
                 ,  '월'
                 ,  SUBSTRING(idate, 7,2)
                 ,  '일 '
                 ,  SUBSTRING(idate, 9,1)
                 ,  '시'
  ), '누락') INDIDT               
   , IFNULL(ip, (SELECT ip FROM 3 WHERE id= 'a')) IP
   , IFNULL(id, 'a') ID
   , sdate STDT
   , h
  FROM
   (SELECT
     h
    FROM
      1) A
  LEFT OUTER JOIN
   (SELECT
     A.*
            , B.ip
    FROM
     2 A
          , 3 B
    WHERE
      A.id = 'a'
          AND A.id = B.id
    AND A.sdate LIKE '20100330%') B
  ON A.h = SUBSTRING(B.sdate, 9, 1)
 
과 같이 출력을 하면
 T1  INDI  INDIDT  IP ID   STDT  h
 0분 ~ 1분  201003300  2010년 03월 30일 0시  127.0.0.1   a  201003300  0
 누락  누락   누락   127.0.0.1   a   {null}   1
 2분 ~ 3분  201003302  2010년 03월 30일 2시  127.0.0.1   a  201003302  2
 3분 ~ 0분  201003303  2010년 03월 30일 3시  127.0.0.1   a  201003303  3
 0분 ~ 1분  201003310  2010년 03월 31일 0시  127.0.0.1   a  201003310  0
 1분 ~ 2분  201003311   2010년 03월 31일 1시  127.0.0.1   a  201003311  1
 누락  누락   누락  127.0.0.1  a  {null}  2
 3분 ~ 0분  201003313  2010년 03월 31일 3시  127.0.0.1  a  201003313  3
위와 같이 출력 됩니다.
 
그래서 이 조건 중에서 누락 부분 만 날짜를 포함해서 출력을 하려고 했는데요.
그렇게 하자면 테이블에 데이터가 존재하지 않기 때문에 이를 감안해서 누락된 데이터의 날짜를 포함해서 출력해야 하는 부분이 포함되어야 합니다.
 
그리고 날짜 검색을 위에서는 하루 분만 검색을 하는데 기간 검색으로 바꾸어 위의 쿼리에서 left outer join
부분만 나타내겠습니다.
 LEFT OUTER JOIN
   (SELECT
     A.*
            , B.ip
    FROM
     2 A
          , 3 B
    WHERE
      A.id = 'a'
          AND A.id = B.id
    AND A.sdate <= '20100330%'
    AND A.sdate >= '20100331%'
) B
  ON A.h = SUBSTRING(B.sdate, 9, 1)
    WHERE B.TI IS NULL
 
이와 같이 출력하거나
LEFT OUTER JOIN
   (SELECT
     A.*
            , B.ip
    FROM
     2 A
          , 3 B
    WHERE
      A.id = 'a'
          AND A.id = B.id
    AND A.sdate <= '20100330%'
    AND A.sdate >= '20100331%'
) B
  ON A.h = SUBSTRING(B.sdate, 9, 1)
  WHERE B.sdate <= '20100331%'
  AND B.sdate >= '20100330%'
  AND B.TI IS NULL
와 같이 하면 기간내에서 누락된 값이 출력되지 않거나 원하지 않는 값이 출력 됩니다.
 
제가 쿼리를 잘못 작성 한 듯 한데 원하는 답을 찾을 수가 없습니다.
도움 부탁드리겠습니다.

이 글에 대한 댓글이 총 6건 있습니다.

 뭔가 복잡하네요. 급박이라 시일도 지났을 듯 하지만 아직도 도움이 필요하시다면 샘플 데이터 생성을 위한 구문이나 데이터를 같이 올려주시면 좋을 것 같습니다.

박현우(lqez)님이 2010-04-26 18:24에 작성한 댓글입니다.

제 메일 주소는 ---입니다. (메일 받았습니다. 주소는 삭제합니다.)

박현우(lqez)님이 2010-04-27 10:54에 작성한 댓글입니다.
이 댓글은 2010-04-27 15:19에 마지막으로 수정되었습니다.

오오 현우님 e-mail이라 ㅋㅋ

 

그냥 두셨으면 메일이 하루에도 수십통씩 올듯 ㅋㅋ

박성원(darkancia)님이 2010-04-30 15:32에 작성한 댓글입니다.

- -; 어찌 그걸 모르겠습니까?
부탁하는 저도 죄송하지만 어쩔 도리가 없군요.

어지간한 건 혼자 해결하려고 해서 노력해서 푸는 데, 이건 방법이 잘 먹히 질 않네요. - -;
바쁘신 데도 성심 성의 껏 도와주려 하신 현우님에게 고맙다는 말씀 다시 드리겠습니다.

바램님이 2010-05-03 14:38에 작성한 댓글입니다.
이 댓글은 2010-05-03 14:40에 마지막으로 수정되었습니다. Edit

몇 가지 생각해보았는데, dummyhm 테이블 외에 별도의 더미 테이블을 추가하는 방법이 제일 간단한 것 같습니다.

 

일단 검색하고자 하는 대상이 되는 날짜를 저장하는 dummydt 테이블을 추가합니다.

CREATE TABLE `dummydt`' ( `YMD` VARCHAR(8) );

 

2010년 3월 30일부터 31일까지 검색하고자 한다면, 아래와 같이 입력합니다.

TRUNCATE TABLE `dummydt`;

INSERT INTO `dummydt` VALUES ('20100330'), ('20100331');

 

그리고, 제시해주신 쿼리 중에서 FROM 절 이하를 수정합니다.

(생략...) FROM
   (SELECT
     CONCAT( YMD, HM ) AS YMDHM
    FROM 
      dummydt, dummyhm ORDER BY YMD ASC, HM ASC
) A
  LEFT OUTER JOIN
   (SELECT
     A.*
            , B.IPADDRESS
    FROM
     USERLP A
          , USERTABLE B
    WHERE
      A.USERID = 'userid'
          AND A.UserID = B.UserID
    AND A.STYMDHM BETWEEN '201003300000' AND '201003312345' ) B
  ON A.YMDHM = B.STYMDHM

ORDER, BETWEEN 등은 필요에 따라 적절히 수정하시면 되겠습니다.

원하시는 답변인지는 잘 모르겠습니다.

박현우(lqez)님이 2010-05-11 17:02에 작성한 댓글입니다.

원하는 답변이 나온 듯 합니다. ^^

다른 것 처리 중에 있어 아직 적용 하지 않았지만,
제가 생각하지 못했던 좋은 방법 제시해 주셔서 감사합니다. ^^~

이렇게 까지 신경 써 주셔서 너무 감사하고, 바쁘신 와중에 소중한 답변 남겨 주신 점 거듭 감사드립니다.

그리고 위의 질문 글은 사정 상 예전 것으로 고쳐 올리겠습니다. 

그럼 수고하세요. ^^

 

바램님이 2010-05-12 09:52에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
29629앞부분의 일부가 일치하는 데이터들을 그룹화해서 얻어오는 법 [2]
제로당
2010-04-26
7028
29628간단한 쿼리 초보입니다. [1]
쿼리왕초보ㅠㅠ
2010-04-23
7746
29627쿼리 최적화 질문입니다.// [4]
최현석
2010-04-22
7580
29626수정된 글 올렸습니다. mysql 기간 검색입니다. 도와주세요. ㅠㅠ [급박] [6]
바램
2010-04-22
9940
29625[질문] mysql 프로시저를 통해 테이블 생성하기. [1]
이근호
2010-04-22
9785
29624[초보] mysql 3.23.58 db생성시 에러 [2]
도날드벅
2010-04-21
7555
29622sql 테이블 열의 합 구하는 쿼리문 [1]
임상묵
2010-04-19
8136
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다