2011-04-13 50 views
1

我有3個房間房間,酒店,城市,我如何選擇10個最便宜的房間和每個城市的hotel_id 可能爲每個城市執行子查詢?每個城市10個最便宜的房間

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 
) 

與子查詢的查詢

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 

如果有些酒店有一些room_price1該查詢返回更多然後3行中的城市,我需要3每個城市獨特的酒店這種查詢可以從一個酒店

返回3房

生病嘗試使用用戶瓦爾

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或ROW_NUMBER < 6(我的初始化數據)

+0

也許你可以描述_hotel_ _room_和_City_的架構? – gideon 2011-04-13 15:31:44

+0

這是Kynth認爲的實際功課嗎?這會影響我的答案,因爲在MySQL中使用用戶變量的最佳方式是使用用戶變量,但作業可能希望您使用子查詢。 – 2011-04-13 15:33:23

回答

2

有一噸不同的博客文章關於這個話題在那裏的。

對我來說,最有價值的,有可能是

Xaprb後(見「選擇從每個組的頂部N行」進行了詳細的解釋)

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

在你的情況下將意思。根據您的需要對此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 

,你可以看到你做出一個子查詢選擇的所有客房 有一個價格比當前根下的計數,看看是否 的計數小於或等於10。

特別觀察如何改變了

f.price < fruits.price 

r.price > rt.price 

因爲Xaprb的例子,他選擇的N個最便宜的水果

希望有所幫助。

順便說一句,Stackoverflow不是爲了解決作業。你應該學習一些你自己的東西;-)

+0

可以問一下家庭作業:http://meta.stackexchange.com/questions/10811/how-to-ask-and-answer-homework-questions – Kynth 2011-04-14 08:49:38

+0

+1用於解決使用類似問題的解決方案來演示技術。 – Kynth 2011-04-14 08:53:15

+0

嘗試使用後查詢http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/通過無法適應它 如果拖曳或多個水果有一些價格,結果行數不相等3,價格匹配數量增加 – eugenes 2011-04-14 10:00:57

1

我假設表Room具有參考其所屬的Hotel

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

這似乎並不符合「針對每個城市」的要求。 – 2011-04-13 15:36:33

+0

爲city_id添加了GROUP BY – 2011-04-13 15:42:51

+0

值得注意的是,特別是如果這確實與家庭作業有關,即使問題標記爲MySQL,「限制10」子句是MySQL方言特定的。其他SQL方言有不同的命令子句。例如,MS SQL Server使用的T-SQL將使用「SELECT TOP 10 price ...」。 – Kynth 2011-04-13 15:53:24