2013-02-15 92 views
2

请忍受我,因为我的SQL不太好。跨越三张表的SQL查询

我想编写一个查询,考虑来自3个不同表格的信息。

让我解释一下情况:当客户预订一个房间时,他们会偏好几个房间,并且可以在不同的时间预订房间(每天只能预订一次)。

我现在想编写一个查询来检查一天中某个时间段的房间是否可用。这些都是我的数据库中的表我有

房间

此表存储每个房间

Fields: 

id (primary key) 
capacity  
img 
notes 
building_id 
roomstructure_id  
lecturestyle_id 

要求

此表存储每个请求消息作出

信息
Fields 

id (primary key) 
day_id 
period_id 
preference_id (foreign key from preference.id) 

此表存储有关每个请求的信息。

偏好

此表存储所有的房间喜好信息。

id (PK)  
request_id (foreign key from request.id)  
room_id (foreign key from room.id) 

我希望我所做的事情变得明显。

举例来说,如果我检查房间是否是C233周一09:00预订 - 我需要查找房间信息在房间表,然后使用ROOM_ID偏好表查找request_id

一旦我有REQUEST_ID已经链接到特定的房间(在房间偏好表)我可以看到无论是在请求表day_id = 1和period_id = 1。如果day_id = 1且period_id = 1,则表示该房间在周一09:00点预订。

这意味着房间不可用,因此不计算在内,但如果找不到这一行,则会计算在内。

这是我到目前为止已经写的SQL - 它很简单,但它不会做一切我想做的事情:在另一个

SELECT COUNT(*) totalCount FROM ts_room 

除了这个,我一直在献计论坛 - 这里的代码。但它根本不起作用。我不认为它符合我的标准:

SELECT COUNT(*) totalCount 
FROM room a 
     INNER JOIN preference b 
      ON a.id = b.room_id 
     INNER JOIN ts_request c 
      ON b.request_id = c.preference_id 
WHERE c.day_id = 1 AND c.period_id = 1 

在此先感谢!

+0

查询未选择特定房间(例如C233),但总体结构似乎正确。当你说它不在al工作时,你的意思是什么? – 2013-02-15 20:20:52

+0

@Darius,为什么查询不选择特定的房间?我正在与这个项目的奥马尔 - 我们已经测试了代码,并注意到返回 – methuselah 2013-02-15 20:49:59

+0

所以你的意思是返回0,或返回NULL,或....?它应该返回一个整数,即使没有找到适合您的条件的房间 – Melanie 2013-02-15 22:09:09

回答

0

好的,你发布的代码接近正确,但有几个问题。首先,请求表的姓名不一致。在您的描述中,您只需将其称为'请求',但在代码中则为'ts_request'。尽管你的问题可能只是一个错字。

另一个问题是您的第二个INNER JOIN中的键(首选项和请求之间)是混在一起的。你有b.request_id = c.preference_id。 IE:你试图将两个外键匹配起来,而不是用它们代表的主键。您只需要一个主/外键进行连接。所以这应该工作(未测试):

SELECT COUNT(*) totalCount 
FROM room a 
     INNER JOIN preference b 
      ON a.id = b.room_id 
     INNER JOIN request c 
      ON b.request_id = c.id 
WHERE c.day_id = 1 AND c.period_id = 1 

(我不使用完全非描述性标识,A,B和C的粉丝,但它是有效的代码我个人至少使用RM, rq,pf或其他可识别的东西,或者甚至只是坚持使用表名称,因为它们相当短)

有一点需要注意的是,从请求和首选项表中有两个方向的外键意味着每个请求只有一个首选项。 (如果请求表中的preference_id字段可以保留为空/空,则可能为零)。如果您希望可以为每个请求提交多个首选项,那么应删除该preference_id外键列,因为它不是独特的价值。上述查询也不是必需的,但如果确实每个请求确实存在一个首选项的限制,那么显然可能将其包含在其他地方。

编辑:正如您对问题的评论中所述,此查询也不会查找特定房间,而是返回为第1天第1期预留的房间总数。如果您想要特定房间,你还必须在你的WHERE子句中添加“AND a.id =”。