【问题标题】:SQL JOIN OPERATIONSQL 连接操作
【发布时间】:2011-12-14 07:12:15
【问题描述】:

我有三张桌子

CREATE TABLE IF NOT EXISTS `tbl_hotelinfo` (
  `hotel_id` int(11) NOT NULL AUTO_INCREMENT,
  `hotel_name` varchar(20) NOT NULL,
  `hotel_normal_room` int(3) NOT NULL,
  `hotel_delux_room` int(3) NOT NULL,
  `hotel_nonac_room` int(3) NOT NULL,
  `hotel_ac_room` int(3) NOT NULL,
  `hotel_owner_email` varchar(20) NOT NULL,
  `hotel_owner_index` int(11) NOT NULL,
  `hotel_state` varchar(11) NOT NULL,
  `hotel_district` varchar(11) NOT NULL,
  `hotel_phno` int(13) NOT NULL,
  `hotel_location` varchar(20) NOT NULL,
  PRIMARY KEY (`hotel_id`)
)
CREATE TABLE IF NOT EXISTS `tbl_hotelbooking` (
  `hotel_id` int(11) NOT NULL,
  `normal_room_booked` int(3) NOT NULL DEFAULT '0',
  `delux_room_booked` int(3) NOT NULL DEFAULT '0',
  `nonac_room_booked` int(3) NOT NULL DEFAULT '0',
  `ac_room_booked` int(3) NOT NULL DEFAULT '0'
)
CREATE TABLE IF NOT EXISTS `tbl_room_types` (
  `hotel_id` int(11) NOT NULL,
  `hotel_normal_room` enum('yes','no') NOT NULL DEFAULT 'no',
  `hotel_delux_room` enum('yes','no') NOT NULL DEFAULT 'no',
  `hotel_nonac_room` enum('yes','no') NOT NULL DEFAULT 'no',
  `hotel_ac_room` enum('yes','no') NOT NULL DEFAULT 'no',
  `normal_fair` int(11) NOT NULL,
  `delux_fair` int(11) NOT NULL,
  `non_ac_fair` int(11) NOT NULL,
  `ac_fair` int(11) NOT NULL
) 

现在我需要加入这三个表来查找那些有空房的酒店的hotel_name,hotel_location 假设我们有可用的hotel_id。首先我必须为每个room_type找到可用于特定hotel_id的hotel_room_types(哪个枚举类型是假设仅对于普通房间枚举类型是是)检查tbl_hotelinfo.hotel_normal_room>tbl_hotelbooking.normal_room_booked 我试过了

$q="SELECT total.hotel_name ,total.hotel_phno 
        FROM   tbl_hotelbooking AS book ,
        tbl_hotelinfo AS total,
        tbl_room_types AS rtype 
        WHERE
        SELECT * from tbl_room_types
        rtype.hotel_id='$hotel_id'
        ";

【问题讨论】:

  • 这里的实际问题是什么?
  • 你试过什么?

标签: php mysql sql phpmyadmin


【解决方案1】:

这不是问题的答案(到目前为止,您还没有提出实际问题),只是一个建议。

在表“tbl_room_types”中,您可以使用数据类型为tinyint 的单列room_type,而不是为每个房间类型设置不同的列。

  • 1 表示正常
  • 2 豪华版
  • 3 for ac 等等...

否则,如果将来添加一些新的房间类型,您将不得不添加不同的列。

或者您可以将枚举定义为enum('d','n','ac', 'nac')

d 代表豪华,n 代表普通,依此类推...

【讨论】:

    【解决方案2】:
    select h.hotel_name,
           h.hotel_location,
    from tbl_hotel_info h
    join tbl_hotelbooking b on h.hotel_id = b.hotel_id
    where h.hotel_normal_room < b.normal_room_booked
       or h.delux_room  < b.delux_room_booked
       or h.ac_room < b.ac_room_booked
       or h.nonac_room < b.nonac_room_booked;  
    

    顺便说一句,这是一个非常糟糕的设计!我可以有带空调的普通房或不带空调的豪华房吗? room_types 中的枚举似乎没有任何用途。

    【讨论】:

      【解决方案3】:

      INNER JOIN w3school

      检查一下……也练习一下;)

      【讨论】:

        猜你喜欢
        • 2022-07-30
        • 2021-11-09
        • 1970-01-01
        • 1970-01-01
        • 2021-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-20
        相关资源
        最近更新 更多