2011-04-13 46 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

相关问题