我正在为我的学校设备设备预订系统.
这基本上是我的表格的样子:
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
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
如何获取上述查询的"结果"然后重新查询"tblequipment"表,但排除上面"结果"中的项目(因为它们不可用).请记住,我上面的查询可能会返回多行.
对此有任何帮助都很棒,谢谢!
关于#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
)
Run Code Online (Sandbox Code Playgroud)
这选择没有预约的设备.请注意,通过仅进行两次比较,我简化了用于确定设备是否保留的逻辑.
最后,一个不相关的注释:我强烈反对在数据库表中将时间戳存储为整数.使用MySQL的内置DATETIME类型.如果需要转换为/从时间戳转换,可以使用UNIX_TIMESTAMP()和FROM_UNIXTIME()函数.