PHP/MySQL预约系统

2 php mysql select

我正在为我的学校设备设备预订系统.

这基本上是我的表格的样子:

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"表,但排除上面"结果"中的项目(因为它们不可用).请记住,我上面的查询可能会返回多行.

对此有任何帮助都很棒,谢谢!

Vot*_*ple 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
)
Run Code Online (Sandbox Code Playgroud)

这选择没有预约的设备.请注意,通过仅进行两次比较,我简化了用于确定设备是否保留的逻辑.

最后,一个不相关的注释:我强烈反对在数据库表中将时间戳存储为整数.使用MySQL的内置DATETIME类型.如果需要转换为/从时间戳转换,可以使用UNIX_TIMESTAMP()FROM_UNIXTIME()函数.