我对数据库的基本上小白. 请高手帮助时候尽量使用简单的解释.是这样我最近在做一个Project. 这个Project里面有如下几个表单, 图一.每个Hotel下有若干个Room. 每个Room下有若干Deals, 每个Deal不同的时间段价格上下有浮动.图中Product_Root和Products是一个表单, 以Parent_ID来分辨是Hotel还是该Hotel的Room图2是我输入了一些数据Sample.当我查询的时候, 会查询如下项目. ProductName, HotelStar, NumPeople, Valid_StartDate, Valid_EndDate, Deal_StartDate, Deal_EndDate, Deal_Price. 等等.
这个还好说, 大概应该是Select * from view_Site_Hotel_Basic_Search where ProductName like ("%Bei%") AND HotelStar = 5 etc etc.现在问题来了. 我查询还好说可以查出结果, 但是我要进行Hotel List, 也就是说我需要现实Hotel的基本信息和最低价格, 而我现在查询出来了是个多个符合数据结果. 我如何才能把他们每个Hotel自己的最低价格列出来?比如这个Sample的数据. 通过查询我应该只显示3行符合我查询结果的数据, 而不是8行.

解决方案 »

  1.   

    图看不见。 
    建议象下面这个贴子中一样,贴出你的表结构和数据样本以及正确的结果。http://topic.csdn.net/u/20090520/22/2940e161-fded-4067-9826-6268b35d0ed3.html
    
      

  2.   

    哎哟. 我把图重新贴一遍. 原来是图片路径被block了.
      

  3.   

    Table 具体内容如下CREATE  TABLE IF NOT EXISTS `CHSMS`.`Products` (
      `ProductID` INT(10) NOT NULL AUTO_INCREMENT ,
      `Products_Number` VARCHAR(20) NOT NULL ,
      `CategoryID` INT(10) NOT NULL ,
      `Parent_ProductID` INT(10) NULL DEFAULT -1 ,
      `ProductName` VARCHAR(150) NOT NULL ,
      `ProductSummary` TEXT NOT NULL ,
      `CreateDate` DATETIME NOT NULL ,
      `LastUpdateDate` DATETIME NOT NULL ,
      `SortOrder` TINYINT(3) NULL DEFAULT 1 ,
      `IsActive` TINYINT(3) NULL DEFAULT 1 ,
      PRIMARY KEY (`ProductID`) )
    ENGINE = InnoDB
    CREATE  TABLE IF NOT EXISTS `CHSMS`.`Products_Hotel` (
      `Product_HotelID` INT(10) NOT NULL AUTO_INCREMENT ,
      `ProductID` INT(10) NOT NULL ,
      `HotelStar` TINYINT(1) NULL ,
      `Facilities` VARCHAR(200) NULL DEFAULT '0' ,
      PRIMARY KEY (`Product_HotelID`) )
    ENGINE = InnoDB
    CREATE  TABLE IF NOT EXISTS `CHSMS`.`Products_Room` (
      `Product_RoomID` INT(10) NOT NULL AUTO_INCREMENT ,
      `ProductID` INT(10) NOT NULL ,
      `NumPeople` TINYINT(3) NULL DEFAULT 1 ,
      `MaxPeople` TINYINT(3) NULL DEFAULT 1 ,
      PRIMARY KEY (`Product_RoomID`) )
    ENGINE = InnoDBCREATE  TABLE IF NOT EXISTS `CHSMS`.`Deals` (
      `DealID` INT(10) NOT NULL AUTO_INCREMENT ,
      `Deals_Number` VARCHAR(20) NOT NULL ,
      `CategoryID` INT(10) NOT NULL ,
      `ProductID` INT(10) NOT NULL ,
      `DealTypeID` INT(10) NOT NULL ,
      `DealName` VARCHAR(150) NULL ,
      `Valid_StartDate` DATE NOT NULL ,
      `Valid_EndDate` DATE NOT NULL ,
      `Deal_CreateDate` DATETIME NULL ,
      `Deal_UpdateDate` DATETIME NULL ,
      `IsActive` TINYINT(3) NULL DEFAULT 1 ,
      `IsDelete` TINYINT(3) NULL DEFAULT 0 ,
      PRIMARY KEY (`DealID`) )
    ENGINE = InnoDB
    CREATE  TABLE IF NOT EXISTS `CHSMS`.`Deal_Regular` (
      `Deal_RegularID` INT(10) NOT NULL AUTO_INCREMENT ,
      `DealID` INT(10) NOT NULL ,
      `Deal_StartDate` DATE NOT NULL ,
      `Deal_EndDate` DATE NOT NULL ,
      `CurrencyID` INT(10) NOT NULL ,
      `Deal_Price` DECIMAL(8,2) NOT NULL ,
      `Deal_GroupPrice` DECIMAL(8,2) NULL DEFAULT 0 ,
      `IsActive` TINYINT(3) NULL DEFAULT 1 ,
      PRIMARY KEY (`Deal_RegularID`) )
    ENGINE = InnoDB
    CREATE VIEW `CHSMS`.`view_Site_Hotel_Basic_Search` AS SELECT products_Root.ProductID AS Product_HotelID, products_Root.ProductName AS Hotel_Name, products_hotel.HotelStar, products_room.NumPeople, products_hotel.Facilities, deals.Valid_StartDate, deals.Valid_EndDate, deal_regular.Deal_StartDate, deal_regular.Deal_EndDate, deal_regular.CurrencyID, deal_regular.Deal_Price
    FROM ((((products AS products_Root INNER JOIN products ON products_Root.ProductID = products.Parent_ProductID) INNER JOIN products_hotel ON products_Root.ProductID = products_hotel.ProductID) INNER JOIN products_room ON products.ProductID = products_room.ProductID) INNER JOIN (deals INNER JOIN deal_regular ON deals.DealID = deal_regular.DealID) ON products.ProductID = deals.ProductID) LEFT JOIN deal_freemore ON deal_regular.Deal_RegularID = deal_freemore.Deal_RegularID
    WHERE (((products_Root.CategoryID)=1) AND ((products_Root.IsActive)=1) AND ((products.IsActive)=1) AND ((deals.IsActive)=1) AND ((deal_regular.IsActive)=1))
    我想得出正确的结果如图所致: 剩下3行
    Product_HotelID, Hotel_Name, HotelStar, .......Deal_Price
    6, BeiJing 5 stars Hotel, 5 , ...... 490
    10, Guang Dong 5 Star, 5, ...... 550
    9, BeiJing 4 star Hotel, 4, ...... 250这样.
      

  4.   

    提供一下测试数据。即表 中的数据样本,通过这些数据能够生成Product_HotelID, Hotel_Name, HotelStar, .......Deal_Price
    6, BeiJing 5 stars Hotel, 5 , ...... 490
    10, Guang Dong 5 Star, 5, ...... 550
    9, BeiJing 4 star Hotel, 4, ...... 250
      

  5.   

    在View中的数据样本是6, 'Bei Jing 5 stars Hotel', 5, 1, '102,104,108,', '2009-05-01', '2010-05-01', '2009-05-01', '2009-12-01', 4, 519.00
    6, 'Bei Jing 5 stars Hotel', 5, 1, '102,104,108,', '2009-05-01', '2010-05-01', '2009-12-02', '2010-02-01', 4, 530.00
    6, 'Bei Jing 5 stars Hotel', 5, 1, '102,104,108,', '2009-05-01', '2010-05-01', '2010-02-02', '2010-05-01', 4, 500.00
    6, 'Bei Jing 5 stars Hotel', 5, 1, '102,104,108,', '2009-05-01', '2010-05-01', '2009-06-01', '2009-08-31', 4, 490.00
    6, 'Bei Jing 5 stars Hotel', 5, 2, '102,104,108,', '2009-05-01', '2010-06-01', '2009-05-01', '2010-05-01', 4, 600.00
    10, 'Guang Dong 5 Star', 5, 1, '101,102,105,108,', '2009-06-01', '2009-08-31', '2009-06-01', '2009-08-31', 4, 550.00
    9, 'Bei Jing 4 stars Hotel', 4, 2, '101,102,104,', '2009-09-01', '2009-12-31', '2009-09-01', '2009-12-31', 4, 250.00
    9, 'Bei Jing 4 stars Hotel', 4, 2, '101,102,104,', '2009-09-01', '2009-12-31', '2010-01-01', '2010-02-28', 4, 260.00
    最后剩下
    6, 'Bei Jing 5 stars Hotel', 5, 1, '102,104,108,', '2009-05-01', '2010-05-01', '2009-06-01', '2009-08-31', 4, 490.00
    10, 'Guang Dong 5 Star', 5, 1, '101,102,105,108,', '2009-06-01', '2009-08-31', '2009-06-01', '2009-08-31', 4, 550.00
    9, 'Bei Jing 4 stars Hotel', 4, 2, '101,102,104,', '2009-09-01', '2009-12-31', '2009-09-01', '2009-12-31', 4, 250.00
      

  6.   

    以你七楼数据为准,从源数据得到 最后剩下 数据。select a.*
    from view_Site_Hotel_Basic_Search a inner join (
    select  Product_HotelID, min(Deal_Price) as minDeal_Price
    from view_Site_Hotel_Basic_Search group by Product_HotelID
    ) b on a.Product_HotelID=b.Product_HotelID and a.Deal_Price=b.minDeal_Price
      

  7.   

    或者
    select *
    from view_Site_Hotel_Basic_Search a
    where not exists (select 1 from view_Site_Hotel_Basic_Search 
    where Product_HotelID=a.Product_HotelID 
    and Deal_Price<a.minDeal_Price);
      

  8.   

    太谢谢了, 再请教一下如果我想加入 HotelStar = 5 AND NumPeople = 1 AND 其他条件 应该把where写在哪个地方呢?
      

  9.   

    select a.*
    from view_Site_Hotel_Basic_Search a inner join (
        select  Product_HotelID, min(Deal_Price) as minDeal_Price
        from view_Site_Hotel_Basic_Search group by Product_HotelID
        ) b on a.Product_HotelID=b.Product_HotelID and a.Deal_Price=b.minDeal_Price
    where a.HotelStar = 5 AND a.NumPeople = 1 AND 其他条件 当您的问题得到解答后请及时结贴.
    http://topic.csdn.net/u/20090501/15/7548d251-aec2-4975-a9bf-ca09a5551ba5.html
      

  10.   

    太感谢楼上大大, 我在问最后2个比较sb的问题.1. 如上方法, 像HotelStar 这样全部一致的数据没问题, 但是比我想先查询出 
    Deal_StartDate <= 2009-09-10 AND Deal_EndDate >= 2009-09-10 这样应该显示的如下结果
    6, 'Bei Jing 5 stars Hotel', 5, 1, '102,104,108,', '2009-05-01', '2010-05-01', '2009-05-01', '2009-12-01', 4, 519.00
    9, 'Bei Jing 4 stars Hotel', 4, 2, '101,102,104,', '2009-09-01', '2009-12-31', '2009-09-01', '2009-12-31', 4, 250.00好像加到最后是查询结束后再次过滤. 我想应该是先进行查询后再进行过滤最小价格.
    2. 怎样才能结贴?
      

  11.   

    select a.*
    from view_Site_Hotel_Basic_Search a inner join (
        select  Product_HotelID, min(Deal_Price) as minDeal_Price
        from view_Site_Hotel_Basic_Search 
        where Deal_StartDate <= '2009-09-10' AND Deal_EndDate >= '2009-09-10' 
        group by Product_HotelID
        ) b on a.Product_HotelID=b.Product_HotelID and a.Deal_Price=b.minDeal_Price
    where a.HotelStar = 5 AND a.NumPeople = 1 AND a.Deal_StartDate <= '2009-09-10' AND a.Deal_EndDate >= '2009-09-10' 
      

  12.   

    结贴, 左上角,CSDN图标下结贴去...