在SQL

时间:2017-10-19 15:11:25

标签: php sql

我有一个简单的测试系统,它有固定的时间段连接到笔记本电脑,用于训练日event_machine_time

*************************************************
id   * machine_laptop * machine_name * start_time
*************************************************
1    * Lenovo 001     * XXX45435     * 09:00
2    * Lenovo 001     * XXX45435     * 11:00
3    * Lenovo 002     * YER45435     * 09:00
4    * Lenovo 002     * YER45435     * 11:00
*************************************************

我有另一张表格,收集有关名为event_booking

的预订详情的信息
**************************************************************
id * information_id *   machine_time_id * firstname * surname
**************************************************************
1  * 1              *  1                * Joe       * Blogs
2  * 1              *  3                * Jane      * Smith
**************************************************************

上表与另一个包含事件信息的表event_information相关联

*****************************************
id * date       *  name
*****************************************
1  * 08-21-2017 *  Testing Day
2  * 08-21-2017 *  Testing Day Follow-Up           
*****************************************

基于上述信息,我知道已经进行了以下预订:

Testing day on 21st August 2017
Joe Blogs - XXX45435 - 09:00
Jane Smith - YER45435 - 09:00

所以我知道我可以通过加入两个表来检查所有预订

SELECT
event_machine_time.id AS machine_id,
event_booking.id AS booking_id,
event_machine_time.start_time,
event_machine_time.machine_laptop,
FROM event_machine_time
LEFT JOIN event_booking
ON event_machine_time.id=event_booking.machine_time_id
WHERE information_id= :id
ORDER BY machine_name ASC, start_time ASC

但是我想创建一个只显示可用时间的选择框。我可以使用JS来过滤机器但我想要显示所有时间但禁用已经预订的任何插槽。这就是我被卡住的地方。

输出插槽非常简单:

...choose the machine via a select box and call the Ajax request...

$machine_id = $_POST['machine'];

$Get_Testing_Slots_Query = "
SELECT *
    FROM event_booking
    WHERE machine_time_id = :t_id";

$Get_Testing_Slots = $dbconn->prepare($Get_Testing_Slots_Query);
    $Get_Testing_Slots->bindParam(":t_id",$machine_id);
    $Get_Testing_Slots->execute();

...output all the testing slots...

我知道我可以使用foreach加载所有广告位,然后运行function来检查广告位是否空闲,但这似乎是一种非常复杂的方式。

有没有办法输出所有start_times并将其链接回machine_time_id所以我知道有预订?

所以基本上我希望选择框显示以下内容:

************
* XXX45435 * (selected above)
************

***************
*9:00am BOOKED*
*11:00am FREE *
***************

编辑:

道歉我错过了一个关键部分!另一个表,其中包含名为event_information的事件信息。我已做出上述修改。

2 个答案:

答案 0 :(得分:1)

试试这个。

SELECT * 
FROM event_information A
inner join event_machine_time B on (1=1) 
left join event_booking C on (B.id = C.machine_time_id and A.id = C.information_id ) 
WHERE A.id = '1'

它是event_machine_time和event_information之间的笛卡尔积,因为每个事件的所有插槽都可以使用每台计算机。然后检查是否在该时间,日期和时段预订了机器。

答案 1 :(得分:0)

您已在查询中使用左连接,并从event_booking中选择了一列,因此您几乎就在那里!

如果booking_id中没有为特定时间段预订任何内容,则SQL语句将返回event_machine_time的空值。尝试将这样的内容添加到您的循环中,输出选择框中的每一行:

print $row['start_time'];

if (is_null($row['booking_id']))
{
    print ' FREE';
}
else
{
    print ' BOOKED';
}