2011-02-23 4 views
0

여기에 나와있는 다른 mysql 가용성 쿼리 질문 중 일부를 살펴본 결과 지금까지는 나에게있어 왔지만, 내 작업 방식은 다른 것들과 약간 다릅니다.mysql 쿼리 룸 가용성

기본적으로 날짜 표가 있으며 각 날짜는 행입니다. 각 행에는 비용, 객실 유형 및 해당 날짜에 예약해야하는 며칠을 말하기위한 필드가 있습니다. 호텔은 1 개 실 유형이 그렇다면, 그것은 5 개 객실 유형이있는 경우는 1,825 행

bd_id int(10) NO PRI NULL auto_increment 
bd_room_type varchar(32) 
bd_date date NO 
bd_price decimal(8,2) 
bd_h_id int(8) NO /* Hotel id */ 
bd_available tinyint(1) /* number of days you must book to include this date */ 

나는로부터 날짜에 도착을해야합니다, 365 개 행을 가지고, 그래서 사이의 격차를 입력합니다 나는 예약을위한 모든 날짜가있다.

$q1 = "SELECT bd_h_id 
FROM booking_dates 
WHERE bd_date IN ('2011-02-16','2011-02-17','2011-02-18') 
AND bd_available <= '3' 
AND bd_room_type = 'single' 
AND bd_price > '0' 
GROUP BY bd_h_id 
HAVING count(*) = '3'"; 

따라서 카운트가 지속 시간과 동일하면 모든 종속성이 충족되었음을 의미하며 검색 결과를 표시 할 수 있습니다.

그런 다음이 쿼리를 변수로 전달하여 호텔 정보를 추출한 다른 쿼리에 하위 쿼리가 아무것도 반환하지 않는지 확인합니다. 하위 쿼리가 1 개 이상의 호텔을 반환하는 경우이 괜찮

$q = "SELECT c_title FROM c_content WHERE c_id IN ($q1) AND IF(($q1) > 0, 1, 0)"; 

그러나, 메인 쿼리는 나에게 오류를 제공합니다

Subquery returns more than 1 row

내가 괜찮을 것 'IN'사용했기 때문에 내가 생각 . 어떤 제안? 또한 여러 하위 쿼리를 구현할 때 솔루션도 함께 사용해야합니다.

객실을 내가 할 수있는대로 우아하게 만드는 것은 알고 있지만, 예약이 대개 일괄 예약 (예 : 예약보다 많기 때문에 필요한 결과를 얻는 방법을 모르겠습니다. 한 번에 하나의 방을 예약 한 경우, 제공된 날짜 동안 한 방의 객실 유형을 사용할 수없는 경우 전체 호텔을 검색 결과에서 제거해야합니다.

답변

2
IF(($q1) > 0, 1, 0) 

이것은 오류를 반환하는 부분입니다.

또한, 당신이 가지고있는 방식으로 $q1이 두 번 평가되는데, 이는 아마도 당신이 원하는 것이 아닙니다.

내가 무엇을하려고하는지 정확히 이해하면이 부분을 그대로 둘 수 있습니다. $q1이 행을 반환하지 않으면 IN 표현식이 전혀 일치하지 않습니다.

서브 쿼리가있는 IN은 MySQL에서 다소 비효율적입니다. 훨씬 빠르게 조인으로 실행됩니다 : 오류 메시지가 쿼리의 끝에서 당신의 IF(($q1) > 0, 1, 0) 절을 참조한다

SELECT `c_title` FROM `c_content` JOIN ($q1) `a` ON `c_content`.`c_id`=`a`.`bd_h_id` 
+1

하하, 귀하의 게시물을보기 직전에 IF 비트가 깨지는 것을 깨달았습니다. 그러나 JOIN 솔루션을 선호하고 분명히 여러 조인으로 잘 작동합니다. :) 감사합니다! – Horse

+0

듣기 좋다! 건배. – awm

0

. 둘 이상의 행을 반환하는 경우 하위 쿼리를 >과 비교할 수 없습니다.