SQL JOIN操作

时间:2011-12-14 07:12:15

标签: php mysql sql phpmyadmin

我有三张桌子

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'
        ";

3 个答案:

答案 0 :(得分:1)

这个问题没有答案(你现在还没有问过实际问题),只是一个建议。

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

  • 1表示正常
  • 2 for deluxe
  • 3 for ac等等......

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

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

d代表豪华,n代表正常,依此类推......

答案 1 :(得分:0)

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;  

顺便说一下,这是一个非常可怕的设计!我可以在没有AC的情况下拥有带AC或豪华房间的普通房间吗? room_types中的枚举似乎没有用处。

答案 2 :(得分:0)

INNER JOIN w3school

检查......并练习;)