2011-03-18 2 views
2

을 만드는 붙어 난 다음 작업을 수행하기 위해 MySQL과 PHP를을 만들려면 :임대 테이블

내가 임대하려는 상점, 임대료는 매주 또는 매월 될 것 가지고 있다고 할 수 있습니다. 나는이 테이블을 만드는 가장 좋은 방법을 찾고 있습니다. 그래서 무료 주나 월을 계산할 수있는 쉬운 쿼리를 할 수 있습니다.

편집

하자, 나는

ID, START_DATE, RENING_TYPE이 CLIENT_ID 말

START_DATE가 임대의 시작 날짜가, 그리고 RENTING_TYPE는 매주 또는

월입니다

빈 주 또는 월을 모두 알고있는 쿼리를 어떻게 실행해야합니까? 따라서 새 C 유치원은 그 주/월을 예약 할 수 있습니다

예를 들어 다른 클라이언트가 6 월 첫 번째 주를 예약하는 클라이언트 예약, 새 클라이언트가 내 시스템에 로그인하고 사용 가능한 모든 주/월을 확인하려면 어떻게해야합니까? 달성 해?

+1

자세한 정보 제발 ...이 테이블은 어떤 종류의 데이터를 보유하고 있으며 어떤 종류의 쿼리를 실행합니까? –

+0

추가 정보를 추가했습니다. 죄송합니다. – trrrrrrm

+1

+1 요청시 추가 정보를 요청합니다. 이제는 함께 일하는 것이 좋습니다. – mario

답변

2

이 쿼리는 예약 사이의 모든 자유 간격을 반환해야합니다 (미안 말로 설명하는 데 실패했습니다). 아직 예약되지 않은 경우 모든 예상되는 무료 일 (종료일 + 1)을 얻은 다음 다음 예약일을 검색합니다. 이런 결과를 내면

Start Free | End Free 
----------------------- 
2011-02-03 | 2011-02-06 
2011-02-08 | 2011-02-12 
2011-02-20 | 2011-03-02 

PHP를 사용하여 정확한 날짜를 얻을 수 있습니다.

쿼리 :

SELECT DATE_ADD(r2.end_date, INTERVAL 1 DAY), 
(
    SELECT DATE_SUB(MIN(starting_date), INTERVAL 1 DAY) 
    FROM renting_table as r1 
    WHERE r1.starting_date > r2.end_date 
) 
FROM renting_table as r2 
WHERE DATE_ADD(end_date, INTERVAL 1 DAY) not in 
(
    SELECT r3.start_date 
    FROM renting_table as r3 
) 

참고 : 구문은 아마 꺼집니다 그래서 내가 SQL 매우 녹슨 해요하지만 난 논리 소리라고 생각합니다. 나는 이것이 당신에게 올바른 방향으로 고개를 끄덕이게하기를 바란다.

1

저는 전체 론적 접근법을 권할 수 없지만 먼저 과제를 단순화 할 것을 권장합니다. 몇 주와 몇 주를 처리하는 대신 몇 주 동안 집중하십시오. 한 달에서 네 주를 동일시하기 위해 약간의 비즈니스 로직을 사용할 수 있습니다.

따라서 처음에는 RENTING_TYPE이 제거됩니다. 그리고 대신 미리 계산을 포함하고 정확한 날짜와 함께 작동하도록하고, 주 단지 직업 런타임 : 상점은 매주 또는 매월 교류를 임대 할 때

ID, CLIENT_ID, START_DATE, END_DATE, WEEKS 

아마 일이 세분화 문제를 피하기 위해 더 나은 밖으로 작동합니다. 많은 쿼리 전문가가 아니므로 셀프 조인 등을 사용하는 대신 PHP에서 날짜를 반복하는 것이 좋습니다.

너무 빠르면 (너무 많은 상점) 나는 CLIENT_ID=0 필러를 고안하려고합니다. 자유로운 장소에 표시하십시오. 이는 검색을 대폭 단순화하고 업데이트가 훨씬 어렵지 않습니다.

0

나는 START_DATE가 절대 일 (#부터 1.1.1970까지)이고 RENTING_TYPE은 (JOIN을 통해 또는 그렇게하는 것으로) 가정한다고 가정합니다. 그래서 스크립트가 다음을 수행합니다

//$reservations = array(start_date => object(id=>1,duration=>7,etc..)) 
$remainingReservedDays = 0; 
for($day = $start;$day < $end;$day++){ 
    if($remainingReservedDays > 0){ 
     echo 'reserved day<br />';//or grayed out checkbox or whatever 
     $remainingReservedDays--; 
    } else if(isset($reservations[$day])){ //new reservation starting today 
     echo 'reserved<br />';//TODO: make me DRY 
     $remainingReservedDays = $reservations[$day]->duration; 
    } else { 
     echo 'free atleast for a week'; 
     //TODO check if available for month 
     //lookup next reservation start_date 
    } 
} 
0

내가 가게를 갖고 싶다고 가정하면, 임대료는 매주 또는 매월이됩니다. 이 테이블을 만드는 가장 좋은 방법을 찾고 있습니다. 무료 주 또는 개월을 계산하기 위해 쿼리를 쉽게 수행 할 수 있습니다.

누군가가 18 일 동안 상점을 임대하기를 원한다면 어떻게됩니까? 당신은 18 일 동안 그것들을 임대 할 것입니다. 손에 조류입니다. . .

  • 종료 날짜를 저장하십시오. 임대 계약은 항상 특정 시작 날짜와 종료일이 인 으로 작성됩니다.
  • 테이블에서 rent_type을 삭제하십시오. 그것을 사용자 인터페이스로 이동하는 것이 편리 할 수 ​​있습니다. 그러나 사용자 인터페이스 나 데이터베이스 어느 것도 일주일이나 한 달 동안 만 임대하도록 제한해서는 안됩니다.
  • CLIENT_ID가 소유자를 나타내는 경우 은이 테이블에 속하지 않습니다. 너 소유자가 임대 기간에 따라 인지 설득 할 수 없다.
  • CLIENT_ID가 임차인을 지칭하는 경우 테이블에 있어야합니다. 비즈니스 요구 사항으로 인해 은 한 개인에게만 대여 할 수 있습니다. 개를 한 번에 여러 명의 세입자에게 대여하는 것은 이례적인 일이 아닙니다. 그들의 이름은 모두 이며, 대개 으로 임대료가 부과됩니다. ( 다른 것들 중에서)
  • 시작 날짜 및 종료 날짜 열을 인덱싱합니다.

이제 SamG의 쿼리를 사용하십시오.

관련 문제