2011-04-13 3 views
1

3 개의 테이블 룸, 호텔, 도시가 있습니다. 각 도시마다 10 개의 저렴한 객실과 그 hotel_id를 어떻게 선택할 수 있습니까? 각 도시마다 하위 쿼리를 실행할 수 있습니까? 일부 호텔이 쿼리는 도시의 3 행 다음 추가 반환 일부 room_price1이 있고 난 도시 당 3 독특한 호텔이 필요하면이 쿼리 한 호텔각 도시에 대해 가장 저렴한 방이 12 개 있습니다.

에서 3 방을 반환 할 수 있습니다

SELECT 
    r.room_price1, r.room_id, h.hotel_name, c.city_name 
FROM Hotel h 
INNER JOIN Room r ON 
    h.hotel_id = r.hotel_id 
INNER JOIN City c USING(city_id) 
WHERE (
    SELECT count(*) from Room as rt 
    JOIN Hotel ht using(hotel_id) 
    where c.city_id = ht.city_id and rt.room_price1 < r.room_price1 OR (rt.room_price1 = r.room_price1 AND rt.room_id < r.room_id) 
) < 3 
ORDER BY c.city_name, h.hotel_id, r.room_price1 

하위 쿼리와

SELECT price, room_id, hotel_id, city_id 
    FROM Hotel 
    JOIN Room USING(hotel_id) 
ORDER BY price 
LIMIT 10 


Scheme 
CREATE TABLE `City` (
    `city_id` int(11) NOT NULL AUTO_INCREMENT, 
    `city_name` varchar(50) NOT NULL, 
    PRIMARY KEY (`city_id`) 
) 

CREATE TABLE `Hotel` (
    `hotel_id` int(11) NOT NULL AUTO_INCREMENT, 
    `city_id` int(11) NOT NULL, 
    `hotel_name` varchar(100) NOT NULL, 
    PRIMARY KEY (`hotel_id`), 
    CONSTRAINT `Hotel_FK_1` FOREIGN KEY (`city_id`) REFERENCES `City` (`city_id`) ON DELETE CASCADE ON UPDATE CASCADE 
) 

CREATE TABLE `Room` (
    `room_id` int(11) NOT NULL AUTO_INCREMENT, 
    `hotel_id` int(11) NOT NULL, 
    `room_name` varchar(255) DEFAULT NULL, 
    `room_price1` int(11) DEFAULT NULL, 
    PRIMARY KEY (`room_id`), 
    CONSTRAINT `Room_FK_1` FOREIGN KEY (`hotel_id`) REFERENCES `Hotel` (`hotel_id`) ON DELETE CASCADE ON UPDATE CASCADE 
) 

쿼리

병 시도의 사용 사용자는

set @num := 0, @type := ''; 
select * 
from (
    select r.room_price1 pr, r.room_id, h.hotel_name, c.city_name, 
     @num := if(@type = city_id, @num + 1, 1) as row_number, 
     @type := city_id as dummy 
    from Hotel h 
    JOIN Room r USING(hotel_id) 
    INNER JOIN City c USING(city_id) 
    order by city_name, r.room_price1 asc 
) as x where x.row_number <=3; 

이 방법을 반환 잘못된 정렬 F를 바르 또는 < 6 (내 초기화 데이터)

+0

_hotel_ _room_ 및 _City_에 대한 스키마를 설명 할 수 있을까요? – gideon

+0

Kynth가 생각한대로 실제로 숙제입니까? 그것은 내 대답에 영향을 미칠 것입니다. MySQL에서 최선의 방법은 사용자 변수를 사용하는 것이지만 숙제는 아마도 하위 쿼리를 사용하기를 원할 것입니다. –

답변

2

이 밖에이 주제에 대한 다른 블로그 게시물의 톤에이 속한 Hotel에 대한 참조를 가지고있다.

나에게 가장 가치, 가능성이 있었다

Xaprb 포스트 귀하의 경우에는

http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

을 (섹션에 대한 자세한 explaination은 "각 그룹에서 상위 N 행을 선택"참조) 그 것 평균. 이 SQL을 사용자의 필요에 맞게 모델링하십시오.

select type, variety, price 
from fruits 
where (
    select count(*) from fruits as f 
    where f.type = fruits.type and f.price < fruits.price 
) <= 2; 

당신이 현재의 루트보다 낮은 가격을 가지고 모든 객실 의 수를 선택하는 하위 쿼리를 만들어보고 경우 생성 볼 수 밖에

SELECT 
    r.price, r.room_id, h.hotel_id, h.city_id 
FROM Hotel h INNER JOIN Room r ON 
    h.hotel_id = r.hotel_id 
WHERE (
    select count(*) from Room as rt 
    where r.hotel_id = rt.hotel_id and r.price > rt.price 
) <= 10; 
ORDER BY h.city_id,h.hotel_id,r.price 

그것을 시도 할 수 있습니다 제가

f.price < fruits.price 
변경 방법 수가 10

특히 관찰 이하인

r.price > rt.price 

Xaprb의 예에서 그는 N을 선택하기 때문에

에 저렴한 과일

하는 데 도움이

희망을.

BTW Stackoverflow는 숙제를 해결하기위한 것이 아닙니다.

+0

숙제에 대해 물어 보는 것이 좋습니다. http://meta.stackexchange.com/questions/10811/how-to-ask-and-answer-homework-questions – Kynth

+0

비슷한 문제를 사용하여 해결책을 제시 한 기술. – Kynth

+0

게시물의 쿼리를 사용하여 시도하십시오 http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/에 의해 적응할 수 없습니다 견인 이상 과일에 가격이있는 경우 결과 행 수가 같지 않음 3, 일치하는 가격 수가 증가 함 – eugenes

1

나는 테이블 Room을 가정하고 ROW_NUMBER

SELECT price, room_id, hotel_id, city_id 
    FROM Hotel,Room 
    WHERE Hotel.hotel_id = Room.hotel_id 
ORDER BY price GROUP BY city_id 
LIMIT 10 
+0

"각 도시에 대해"요구 사항을 충족하지 않는 것 같습니다. –

+0

에 GROUP BY를 추가했습니다. –

+0

특히 숙제와 관련이있는 경우 특히 "제한 10"절이 MySQL 방언과 관련이 있다는 질문이 있더라도 주목하십시오.다른 SQL 사투리는 다른 명령 구를 가지고있다. 예를 들어 MS SQL Server에서 사용되는 T-SQL은 "SELECT TOP 10 price ..."를 대신 사용합니다. – Kynth

관련 문제