2010-03-18 2 views
1

데이터베이스를 쿼리하여 다음을 찾으려고합니다.MySQL - 쿼리에 어떤 문제가 있습니까?

고객이 도시 A와 B 사이의 호텔을 검색하는 경우 두 날짜 사이에 객실이없는 호텔을 찾아 돌려 보냅니다.

각 객실 유형에 A 룸 5 개 객실, B 룸 게스트 룸 10 개 등 여러 개의 객실이 있으며 최소한 데이터베이스가있는 호텔을 찾기 위해 데이터베이스를 쿼리해야합니다 1 개 이상의 객실은 1 개 이상 무료입니다.

내 테이블 구조입니다 :

**Structure for table 'reservations'** 
    reservation_id 
    hotel_id 
    room_id 
    customer_id 
    payment_id 
    no_of_rooms 
    check_in_date 
    check_out_date 
    reservation_date 

    **Structure for table 'hotels'** 
    hotel_id 
    hotel_name 
    hotel_description 
    hotel_address 
    hotel_location 
    hotel_country 
    hotel_city 
    hotel_type 
    hotel_stars 
    hotel_image 
    hotel_deleted 


    **Structure for table 'rooms'** 
    room_id 
    hotel_id 
    room_name 
    max_persons 
    total_rooms 
    room_price 
    room_image 
    agent_commision 
    room_facilities 
    service_tax 
    vat 
    city_tax 
    room_description 
    room_deleted 

그리고 이것은 내 쿼리입니다 :

이미 각 호텔의 각 객실 유형에 예약 된 객실의 수는 예약 테이블에 저장됩니다
$city_search = '15'; 
$check_in_date = '29-03-2010'; 
$check_out_date = '31-03-2010'; 

$dateFormat_check_in = "DATE_FORMAT('$reservations.check_in_date','%d-%m-%Y')"; 
$dateFormat_check_out = "DATE_FORMAT('$reservations.check_out_date','%d-%m-%Y')"; 

$dateCheck = "$dateFormat_check_in >= '$check_in_date' AND $dateFormat_check_out <= '$check_out_date'"; 

$query = "SELECT $rooms.room_id, 
        $rooms.room_name, 
        $rooms.max_persons, 
        $rooms.room_price, 
        $hotels.hotel_id, 
        $hotels.hotel_name, 
        $hotels.hotel_stars, 
        $hotels.hotel_type 
      FROM $hotels,$rooms,$reservations 
      WHERE $hotels.hotel_city = '$city_search' 
      AND $hotels.hotel_id = $rooms.hotel_id 
      AND $hotels.hotel_deleted = '0' 
      AND $rooms.room_deleted = '0' 
      AND $rooms.total_rooms - (SELECT SUM($reservations.no_of_rooms) as tot 
                FROM $reservations 
                WHERE $dateCheck 
                GROUP BY $reservations.room_id) > '0'"; 

.

쿼리가 결과를 전혀 반환하지 않는 것입니다. 비록 내가 직접 계산한다면 그것을해야한다.

하위 쿼리를 단독으로 실행하려고 시도했지만 결과가 없습니다. 그리고 나는 어제부터이 쿼리를 버그를 없애려고 노력하면서 꽤 많은 양의 머리카락을 잃어 버렸습니다. 이게 뭐가 잘못 됐어? 아니면 위에 언급 한 것을 수행하는 더 좋은 방법이 있습니까?

편집 : 버그 수정을 위해 편집 된 코드. Mark Byers에게 감사드립니다. 당신은 첫 번째 피연산자는 스칼라 값 빼기 total_rooms - (tot, id)을하고

$rooms.total_rooms - (SELECT SUM($reservations.no_of_rooms) as tot, 
               $rooms.room_id as id 
               FROM $reservations,$rooms 
               WHERE $dateCheck 
               GROUP BY $reservations.room_id) > '0'" 

두 번째는 다음과 같습니다

Sample Data in reservation table 

1 1 1 2 1 3 2010-03-29 2010-03-31 2010-03-17 
2 1 2 3 3 8 2010-03-29 2010-03-31 2010-03-18 
5 1 1 5 5 4 2010-03-29 2010-03-31 2010-03-12 

하위 쿼리가 문제가 여기에있다

Room ID : 1 Rooms Booked : 7 
Room ID : 2 Rooms Booked : 8 

But it does not return any value at all.... If i remove the dateCheck condition it returns 
Room ID : 2 Rooms Booked : 8 

답변

1

를 반환해야 두 개의 열이있는 테이블. 결과 집합에서 열 중 하나를 제거하고 단 하나의 행만 반환하는지 확인하십시오.

쉼표로 테이블을 분리하는 대신 조인을 작성하려면 JOIN 키워드를 사용해야합니다. 그렇게하면 조인 조건을 추가하는 것을 잊지 않을 것입니다. '심지어해야하지만 ... 내가 나오지 않았어 ..

SELECT column1, column2, etc... 
FROM $hotels 
JOIN $rooms 
ON  $hotels.hotel_id = $rooms.hotel_id 
JOIN (
    SELECT SUM($reservations.no_of_rooms) as tot, 
      $rooms.room_id as id 
      FROM $reservations 
      JOIN $rooms 
      ON ??? /* Aren't you missing something here? */ 
      WHERE $dateCheck 
      GROUP BY $reservations.room_id 
) AS T1 
ON  T1.id = room_id 
WHERE $hotels.hotel_city = '$city_search' 
AND $hotels.hotel_deleted = '0' 
AND $rooms.room_deleted = '0' 
AND $rooms.total_rooms - T1.tot > '0' 
+0

덕분에 오류가 없어 ... ...하지만 쿼리 자체가 어떤 결과를 반환하지 않습니다 :

당신은 아마이 라인을 따라 뭔가를 원하는 내 인생을 위해 그것을 알아 내려고 ... 나는 논리적으로 어디로 잘못 갔는지 지적 할 수 있는지 궁금해했다. – SpikETidE

+0

당신의 하위 쿼리가 여전히 잘못된 것으로 의심된다. GROUP BY는 의심스러워 보일 것입니다. 아마도 WHERE가있는 상관 하위 쿼리를 의미 할 것입니다. 상관 하위 쿼리를 사용하는 대신 하위 쿼리를 사용하여 조인하는 것이 좋습니다. 그런 다음 이드를 돌려주고 싶습니다. –

+1

귀하의 질문에 방과 예약 사이에 명백한 관계가없는 이유는 무엇입니까? 새로운 ANSI "JOIN ... ON ..."구문을 사용하여이 쿼리를 다시 작성하는 것이 좋습니다. –