我目前正在为我的学校设备设备预订系统。
这基本上就是我的表格:
tblEquipment:
id name description 1 Camera Takes pictures 2 Projector Projects images 3 Stereo Plays music
tblEvents:
id equipmentID start end 1 2,3 1251312300 1251315900 //Should I use comma delimited entries for equipmentID? 2 1 1251312300 1251315900
关于我的项目,我有几个问题:
1)如果要保留多个设备,(设备ID)在设备ID字段中以逗号分隔,那么(这将会发生多次)?
2)目前,当用户进行预订时,他们首先选择他们的“请求时间”,然后在那时呈现可用项目。这是我用于该查询的内容:
$start = //user's requested time
$start = //user's requested time
SELECT equipmentID FROM tblEvents
WHERE ($start >= start && $start <= end)
OR ($end >= start && $end <= end)
OR ($start <= start && $end >= end
while($row = mysql_fetch_array($data)) {
echo $row['equipmentID']; //Would echo something like:
echo "<br>"; // 2,3
// 1
}
我的问题是:
如何获取上述查询的“结果”然后重新查询“tblequipment”表,但排除上面“结果”中的项目(因为它们不可用)。请记住,我上面的查询可能会返回多行。
对此的任何帮助都会很棒,谢谢!
答案 0 :(得分:5)
关于#1:不!不,不,不,不,不!如果您预留了多个设备,那么您应该在预订表中有多个行(这里看起来像tblEvents
)。为避免重复tblEvents
中的其他字段,您通常会创建第三个表,可能是tblEventEquipment
,只列出哪些设备属于哪个事件。
如果你需要一个以逗号分隔的列表用于输出(似乎不太可能),你总是可以使用GROUP_CONCAT()
生成一个,但是在表格中你想要每个预留的设备一行。否则,SQL无法有效(或有效)地确定在特定时间保留哪些设备。
关于#2,您需要一个类似的查询:
SELECT *
FROM tblEquipment
WHERE NOT EXISTS (
SELECT 1
FROM tblEvents
WHERE tblEvents.equipmentID = tblEquipment.equipmentID
AND $end >= start AND $start <= end
)
选择不预订的设备。请注意,通过仅进行两次比较,我简化了用于确定设备是否保留的逻辑。
最后,一个不相关的注释:我强烈反对在数据库表中将时间戳存储为整数。使用MySQL的内置DATETIME
类型。如果您需要转换为时间戳,则可以使用UNIX_TIMESTAMP()
和FROM_UNIXTIME()
函数。
答案 1 :(得分:2)
不,请勿使用逗号分隔值。如果您希望用户能够签出多个项目,则需要一个新表格:
表:用户,财产,结帐
新的Checkout表格将包含以下字段:
此表可以为任何特定用户提供多个条目。对于公司的笔记本电脑,用户可能在那里一次,对于公司的投影仪,用户可能在那里:
1 | 12 | 23 | 2009-08-17 | 0000-00-00
2 | 12 | 28 | 2009-08-17 | 0000-00-00
至于检查项目是否被保留,我会在属性表中作为一个字段来保存一个布尔值:
is_reserved
(BOOL)
查找可用的项目只不过是检查BOOL值为false的所有项目,并且没有在checkout表中存在并且没有checkin_date。