我有一个简单的测试系统,它有固定的时间段连接到笔记本电脑,用于训练日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
的事件信息。我已做出上述修改。
答案 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';
}