Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在SQL中检查插槽预订可用性时的逻辑_Php_Sql - Fatal编程技术网

Php 在SQL中检查插槽预订可用性时的逻辑

Php 在SQL中检查插槽预订可用性时的逻辑,php,sql,Php,Sql,我有一个简单的测试系统,它有固定的时间段链接到笔记本电脑上,用于训练日,名为event\u machine\u time ************************************************* id * machine_laptop * machine_name * start_time ************************************************* 1 * Lenovo 001 * XXX45435 *

我有一个简单的测试系统,它有固定的时间段链接到笔记本电脑上,用于训练日,名为
event\u machine\u 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\u booking

**************************************************************
id * information_id *   machine_time_id * firstname * surname
**************************************************************
1  * 1              *  1                * Joe       * Blogs
2  * 1              *  3                * Jane      * Smith
**************************************************************
上表与另一个保存事件信息的表
event\u 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
加载所有插槽,然后运行
函数检查插槽是否空闲,但这似乎是一种非常复杂的方法

是否有一种方法可以输出所有的
开始时间
,并将其链接回
机器时间id
,以便我知道有预订

因此,本质上我希望选择框显示以下内容:

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

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


抱歉,我错过了一个关键部分!另一个包含事件信息的表,称为
事件\u信息
。我已经做了上面的更改。

您已经在查询中使用了左连接,并从
事件预订中选择了一列,所以您就快到了

如果在
event\u machine\u time
中没有为特定时段预订任何内容,则SQL语句将为
booking\u id
返回空值。尝试向正在输出选择框中每一行的循环中添加类似的内容:

print $row['start_time'];

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

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'

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

您对左连接的查询是否已经完成了您要做的事情?如果
booking\u id
为空,则插槽打开,否则它被预订。因此,除非我做错了
LEFT JOIN
输出任何匹配的内容,否则它不会输出空。因此它显示的是
事件\u机器\u时间
id
1和3,而不是2和4@JosephGregory
LEFT JOIN
是一个左外部联接,这意味着它将返回“左侧表”(在本例中为event\u machine\u time)中的所有行,并尝试从右侧表中查找匹配行。如果没有匹配的行,它将从左表返回指定的列,从右表返回null。您所描述的是一个内部连接。请尝试此
SELECT*从事件信息中选择一个内部连接事件机器时间B on(1=1)左连接事件预约时间C on(B.id=C.machine\U time\U id和A.id=C.information\U id)其中A.id='1'
事件机器时间
事件信息
之间的笛卡尔乘积,因为每台计算机在每个事件的所有插槽都可用。然后检查机器是否在该时间、日期和时段预订。如果您要测试
$row['booking\u id']==null
为null($row['booking\u id'])
,而不是将其与空字符串进行比较?@bassxzero您是对的,它应该检查空值,不是空值。很抱歉,我错过了一个链接表,我现在已经更正了@JosephGregory新表是否改变了这种逻辑的工作方式?您的问题仍然表明您希望在选择框中获得相同的输出。我还看到您对问题的评论表明,对于左连接和内部连接可能存在一些混淆。