【问题标题】:Sql Min query condition with join带有连接的 Sql Min 查询条件
【发布时间】:2016-07-26 15:40:27
【问题描述】:

我有两张桌子

abserve_hotels                  

hotel_id    name    trendy          

1           A       1               
2           B       1               
3           C       0               
4           D       0               
4           E       0               
6           G       0               
7           F       0

abserve_hotel_rooms   

room_id    room_prize     hotel_id   

1          235            1   
2          500            2    
3          1000           1  
4          2356           7
5          800            7

在这里,我正在使用以下查询

SELECT `h`.*,`ar`.* from `abserve_hotel_rooms` as `ar` JOIN `abserve_hotels` as `h` ON `ar`.`hotel_id` = `h`.`hotel_id` WHERE `h`.`trendy` =1 LIMIT 5

但是,当我使用此查询时,如果该酒店有两个房间,我将检索两次 hotel_id..

即,

hotel_id    name    trendy      room_id    room_prize    

1           A       1           1          235      
1           A       1           3          1000  
2           B       1           2          500         

但是,如果hotel_id 有两个房间,我只需要room_prize 的最小值,

例如,

hotel_id    name    trendy      room_id    room_prize    

1           A       1           1          235      
2           B       1           2          500 

像这样,有人帮帮我..

【问题讨论】:

    标签: mysql join min


    【解决方案1】:

    使用MINGROUP BY 就可以了。

    SQLFiddle:

    http://sqlfiddle.com/#!9/46ff3/1

    SELECT `h`.*,`ar`.room_id, MIN(`ar`.room_prize) as min_room_prize
    from `abserve_hotel_rooms` as `ar` JOIN `abserve_hotels` as `h` ON `ar`.`hotel_id` = `h`.`hotel_id` 
    WHERE `h`.`trendy` =1
    group by h.hotel_id
    LIMIT 5
    

    SQLFiddle 输出:

    hotel_id    name    trendy  room_id min_room_prize
    1   A   1   1   235
    2   B   1   2   500
    

    【讨论】:

    • 我不能这样给。 :( 因为我的两个表都有超过 10 个字段..例如,我在这里只展示了两个表有三个字段
    • 而且它只检索到一个room_id,它的最小值为room_prize。实际上我已经尝试过了.. :(
    • 即,它只显示hotel_id = 1,它的最小值为room_prize,它省略了hotel_id = 2
    • @SuganyaRajsekar 请检查 SQLfiddle 是否按预期工作。 sqlfiddle.com/#!9/46ff3/1
    • 非常感谢 Dylan Su 的努力......但我不知道为什么这对我不起作用......再次感谢...... :)
    【解决方案2】:
    DROP TABLE IF EXISTS hotels;
    
    CREATE TABLE hotels
    (hotel_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
    ,name CHAR(1) NOT NULL
    ,trendy TINYINT NOT NULL
    );
    
    INSERT INTO hotels VALUES
    (1,'A',1),
    (2,'B',1),
    (3,'C',0),
    (4,'D',0),
    (5,'E',0),
    (6,'G',0),
    (7,'F',0);
    
    DROP TABLE IF EXISTS rooms;
    
    CREATE TABLE rooms   
    (room_id  INT NOT NULL AUTO_INCREMENT PRIMARY KEY
    ,room_prize  INT NOT NULL
    ,hotel_id   INT NOT NULL
    );
    
    INSERT INTO rooms VALUES
    (1, 235,1),
    (2, 500,2),
    (3,1000,1),
    (4,2356,7),
    (5, 800,7);
    
    
    SELECT h.*
         , x.room_id
         , x.room_prize
      FROM hotels h
      JOIN rooms x
        ON x.hotel_id = h.hotel_id
      JOIN 
         ( SELECT hotel_id
                , MIN(room_prize) room_prize
             FROM rooms
            GROUP 
               BY hotel_id
         ) y
        ON y.hotel_id = x.hotel_id
       AND y.room_prize = x.room_prize
     WHERE h.trendy = 1
     ORDER 
        BY h.hotel_id 
     LIMIT 5;
    
    +----------+------+--------+---------+------------+
    | hotel_id | name | trendy | room_id | room_prize |
    +----------+------+--------+---------+------------+
    |        1 | A    |      1 |       1 |        235 |
    |        2 | B    |      1 |       2 |        500 |
    +----------+------+--------+---------+------------+
    

    【讨论】:

    • 非常感谢草莓 :)...你太棒了...它正是我所需要的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 2018-03-08
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 2014-12-01
    相关资源
    最近更新 更多