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 24088 게시물 읽기
No. 24088
이런 결과 순수하게 쿼리로 결과를 나오게 할수있을까요?
작성자
박명훈
작성일
2005-07-20 12:31
조회수
1,780

예약 프로그램 내용입니다.

검색하는 사람은 8월11일 부터 9월20일까지 검색하려 합니다.

예약 프로그램은 디비상에 8월1일 과 9월 11일 이라는 날짜를 가지고 있습니다.
그러니까 2개의 필드에 8/1이 있고 9/11 이 있습니다.

검색은 8/11 ~ 9/20 로 했으나 필드에는 8/1 과 9/11 이 있기 때문에
8/1 은 조건에서 제외가 되어도 9/11 까지 기간은 포함되기에 이 데이터가
나와야 합니다.

이상태에서 단순하게 생각하길 날짜로 where 쓰면 될것 같은데 보시다 시피.
조건에서 벗어나는 부분이 있습니다.

그래서 원하는 결과가 나오지 않습니다.

그래서 일단 프로그램으로 필드 날짜를 가지고와서 PHP 상에서 날짜를 매칭시키고 그 결과를 내는 중입니다. 헌데 위처럼 저런 조건
어찌 잘주면 답이 나올것 같은데 쉽지가 않습니다.

쿼리의 달인 분들 부탁드립니다.

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

비슷한 질문이 얼마전 있었습니다.. 아래 예로 테스트 해보세요..

--------------------------------------------------------

create table test (name char(10), start int, end int);

insert into test values ('홍길동',  1000, 1500);
insert into test values ('홍길동',  1100, 1700);
insert into test values ('홍길동',  1800, 1900);
insert into test values ('강감찬',  0900, 1000);
insert into test values ('이순신',  1000, 1400);

select P.name, min(P.start) start, P.end
from (
 select x.name, x.start, (
  select max(y.end)
  from test y
  where x.name = y.name
   and x.end between y.start and y.end
 ) end
 from test x
) P
group by P.name, P.end

이경환(babocom)님이 2005-07-20 13:47에 작성한 댓글입니다.

서브쿼리가 된다면

 

create table tbldate
(
idx char(10)
, startdate datetime
, enddate datetime
)


insert into tbldate values ('1','20041010','20050505')
insert into tbldate values ('2','20050401','20050505')
insert into tbldate values ('3','20050410','20050420')
insert into tbldate values ('4','20041010','20050402')
insert into tbldate values ('5','20041010','20040505')
insert into tbldate values ('6','20051010','20060505')


select a.idx, a.startdate, a.enddate from tbldate a inner join
(
 select b.idx from
  (
  select idx,startdate datex from tbldate
  union all
  select idx,enddate datex from tbldate
  ) b
 where datex >= '20050401' and datex <= '20050430'
 group by idx
) b
on a.idx = b.idx
order by a.idx desc

 

idx        startdate                                              enddate                                               
---------- ------------------------------------------------------ ------------------------------------------------------
4          2004-10-10 00:00:00.000                                2005-04-02 00:00:00.000
3          2005-04-10 00:00:00.000                                2005-04-20 00:00:00.000
2          2005-04-01 00:00:00.000                                2005-05-05 00:00:00.000

(3 row(s) affected)

석이님이 2005-07-20 13:55에 작성한 댓글입니다. Edit

문제의 요점은 오버랩(overlap) 을 쿼리로 어떻게 처리할 수 있는가 하는 것인데.. 

쿼리로 오버랩을 처리하기 위해서는 서버에 상당한 부하가 걸릴 것으로 생각됩니다.  이러한 쿼리가 상당히 난이도는 있는 문제겠지만 피봇쿼리와 마찬가지로 그다지 실용성은 없는듯 보이네요.. 

예로 드린 쿼리를 이해하시면 질문의 문제도 마찬가지로 해결할 수 있을겁니다.  오버랩이 기간이든 아니면 어떠한 범위든..  마찬가지죠..

이경환(babocom)님이 2005-07-20 22:22에 작성한 댓글입니다.

이것이 mssql 이라면 indexed view 라는 것을 써서

매우 빠른 속도로 서비스를 할 수 있습니다.

mysql 에서는 지원 되는지 잘 모르겠네요 ^^;

 

석이님이 2005-07-20 23:12에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
24092my.ini가 없어요 -0-; [4]
베캄
2005-07-20
1337
2409023만건의 검색 속도가 너무 느려요 [5]
고유식
2005-07-20
2656
24089레코드 수를 유지할 수 있을까요? [2]
이진
2005-07-20
779
24088이런 결과 순수하게 쿼리로 결과를 나오게 할수있을까요? [4]
박명훈
2005-07-20
1780
24087[질문] MYSQL에서 NUMBER타입이 있나요? [1]
남상식
2005-07-20
1123
24086랜덤에 비중을 둘 수 있나요? [1]
꾸에엑
2005-07-20
943
24085ASP(Window2003)에서 MySQL(Linux)의 한글을 부를 수가 없습니다. [3]
답답합니다
2005-07-20
1185
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다