PHP / MySQL预约系统

时间:2009-08-19 22:30:03

标签: 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

 }

我的问题是:

如何获取上述查询的“结果”然后重新查询“tblequipment”表,但排除上面“结果”中的项目(因为它们不可用)。请记住,我上面的查询可能会返回多行。

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

2 个答案:

答案 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)

  1. 不,请勿使用逗号分隔值。如果您希望用户能够签出多个项目,则需要一个新表格:

    表:用户财产结帐

    新的Checkout表格将包含以下字段:

    • ID
    • 为person_id
    • PROPERTY_ID
    • CHECKOUT_DATE
    • CHECKIN_DATE

    此表可以为任何特定用户提供多个条目。对于公司的笔记本电脑,用户可能在那里一次,对于公司的投影仪,用户可能在那里:

    1 | 12 | 23 | 2009-08-17 | 0000-00-00
    2 | 12 | 28 | 2009-08-17 | 0000-00-00

  2. 至于检查项目是否被保留,我会在属性表中作为一个字段来保存一个布尔值:

    is_reserved(BOOL)

    查找可用的项目只不过是检查BOOL值为false的所有项目,并且没有在checkout表中存在并且没有checkin_date。