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 27920 게시물 읽기
No. 27920
sql 작성에 대한 문의 입니다.
작성자
작성일
2008-12-12 14:27
조회수
4,497

쉽게 생각이 안나네요 이틀정도 고민했는데 휴~~ 공부가 더 필요한가봐요 


장비를 신청하는 프로그램을 만들고 있습니다. 


장비를 신청을 원하는 날짜와 시간에 이미 다른곳에서 신청했을 경우에는 신청을 못하게 하려고 합니다.


단계 1에서 원하는 날짜와 시간을 입력하게 하면 신청가능한 장비 목록을 화면에 출력하려고 합니다. 





사용기간 선택시 


하루 일 경우 하루 날짜 정보를 가져옵니다 예) 20081212


일정기간일 경우 시작날짜와 끝나는 날짜를 가져옵니다 예) 20081212 ~ 20081215


정기일 경우 요일을 선택하게 됩니다 예) 월, 화 , 수 


그리고 시간을 선택한 후 검색을 누르면 아래쪽에 대여가능한 장비 목록이 나오게 하려고 합니다


대여 테이블에 장비 ,  사용기간타입, 사용시간을 가지고 대여가 가능한 장비 목록을 가지고 오려고 합니다.


대여 테이블 구성은 아래와 같습니다




select 한 결과는 아래와 같습니다.


 


lendtype 은 day 는 하루대여 days 는 일정기간 every 는 정기 대여를 뜻합니다.


그래서 정기대여일시 date_1는  date("w",mktime(00,00,00,12,12,2008))) 해서 나오는 요일에 따른 숫자로 해서 가져옵니다  예) 월요일 -> 1 


그리고 장비(product)은 장비의 고유키값이 입력이 되어집니다. 


| 로서 여러 장비 신청시 구분이 되어지고요 


이렇게 입력된 장비 테이블에서 신청할때 대여가 가능한 장비 목록들을 가져오는 SQL를 작성하려고 하는데 힘이드네요 


제가 한 방법은 일단 장비 테이블에서 모든 장비들을 불러와서


while문으로 돌리면서 장비 고유키값으로 검색을 해보는 방법을 선택했었습니다.




$result = mysql_query(select idx from lend_product order by protype asc,  idx asc);


if(mysql_num_rows($result)) {


  while($proRow = mysql_fetch_array($result)){



   if($lendtype == "day"){


    $date = date("w",mktime(00,00,00,substr($date_1,5,2),substr($date_1,6,2),substr($date_1,0,4)));

         

     $sql  = SELECT idx FROM lend_list WHERE ( product like '".$proRow[0]."|%' or product like '%|".$proRow[0]."|%' ) ";


     $sql .= "and ((date_1 = '20081215' ) or (date_1 <= '20081215' and date_2 <= '20081215') or (date_1 like '%4%') ) ";


     $sql .= "and (stime >= '08' and stime <= '15' or etime = '08' ) ";



   }elseif($lendtype == "days"){

        //


     $sql  = SELECT idx FROM lend_list WHERE ( product like '".$proRow[0]."|%' or product like '%|".$proRow[0]."|%' ) ";


     $sql .= "and ( date_1 = '20081215' or date_1 = '20081216' or date_2 = '20081215' or date_2 = '20081216'  or (date_1 > '20081215' and date_2 > '20081216' ) ) ";


     $sql .= "and (stime >= '08' and stime <= '15' or etime = '08' ) ";


   

       //정기대여 검색

       for($i =$date_1; $i <= $date_2; $i++ ){


         $date = date("w",mktime(00,00,00,substr($i,5,2),substr($i,6,2),substr($i,0,4)));


         $sql = SELECT idx FROM lend_list WHERE  ( product like '".$idx."|%' or product like '%|".$idx."|%' ) ";


         $sql .=  and date_1 like '%".date("w",$date)."%' and (stime  >= '".$stime."' and  stime <= '".$etime."' or etime = '".$stime."' )         


       }

     

   }elseif($lendtype  == "every"){

      


   }


  }



이렇게 까지 생각해봤는데 잘모르겠어요 ㅠ.ㅠ


sql를 어떻게 구상해야 할까요?

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

헉 제가 작성할 글인데 로그인한지 오래 되어서 그런지 

작성자가 안떠있네요 ㅠ.ㅠ

삭제하고 다시 하려고 해도 비밀번호 입력하라고 뜨고 삭제할수도 없어

이렇게 덧글에 남겨 놓습니다.

김필성(fillgun)님이 2008-12-12 14:29에 작성한 댓글입니다.

SQL로는 당연히 답이 잘 안나옵니다.

 

왜냐면 가장 기본적인 정규화 제 1법칙도 지키지 않는 테이블 설계때문입니다.

(product 컬럼은 다른 테이블로 떨어져 나와야합니다.)

 

name이 빌려간 사람이라면 동명이인에 대한 문제도 해결되지 않겠고,

tel이 들어간 것을 보면 제 2 정규화도 지켜지지 않았습니다.

 

 

대여의 type에 따른 시간을 저장하는 방법도 테이블 상에 단순화 시켜서 입력할 수 있는 상황을 좀 어렵게 설계하신 것으로 보입니다.

 

만약 저라면 sdate, stime, edate, etime 이렇게 4가지 만으로 끝내고

day라면 sdate와 edate가 동일하게 저장을 시켜버리고,

every라면 edate를 '9999-12-30'으로 저장을 시켜버리는 것으로 가능한 단순하게 설계를 했을 거 같은데요.

 

 

만약 제가 위와 같이 만들어진 시스템을 유지보수해야 한다면

몇 시간 system을 중단시키더라도 뜯어고친 후에 SQL을 고민하기 시작할 것 같습니다.

 

원하시는 답변이 되지 못할 것 같아 죄송합니다.

우욱님이 2008-12-13 14:41에 작성한 댓글입니다. Edit

아닙니다 

도움이 많이 되었습니다 ^^

every 같은경우는 매일 있는것이 아니라

월요일만 있는경우 아니면 화요일, 수요일 만 있는경우

이렇게 일주일중 특정요일에만 있기 때문에 그렇게 처리하게 되었네요 

여튼 도움이 많이 되었습니다

테이블을 다시 만들어야겠네요

김필성(fillgun)님이 2008-12-14 07:29에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
27924쿼리문이 안돌아가네요~ [6]
한 석
2008-12-12
4167
27922쿼리 작성 도움 부탁드립니다. [1]
로민건
2008-12-12
4324
27921date와 timestamp 중에서 어느 쪽 인덱스가 유리할까요? [2]
다라나
2008-12-12
6181
27920sql 작성에 대한 문의 입니다. [3]
2008-12-12
4497
27919특정필드의 값이 한글인지 영문인지...?? [1]
김한수
2008-12-12
4425
27917명령어 질문이에요.. [1]
고릴라
2008-12-11
4099
27916두개의 쿼리문을 하나로 합치기.. [1]
김동명
2008-12-11
5380
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.020초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다