使用php和mysqli将较大的表与较小的表进行匹配


Match a bigger table with a smaller one with php and mysqli

最重要的是!这个问题的重点是末尾的while循环和后面的"结果表"。

首先,"Fredrik"就是这个例子中登录的那个人。

我在sql中有两个表,"classes"answers"bookings"。"classes"显示所有可用的类,当有人预订其中一个类时,该特定类的id(id_classes)和该人的姓名将在表"bookings"中显示为一行。

classes
id_class     date                    day            
1           2016-03-10 15:00:00     monday
2           2016-03-10 16:00:00     monday
3           2016-03-10 17:00:00     monday
4           2016-03-11 15:00:00     tuesday
5           2016-03-11 16:00:00     tuesday
6           2016-03-11 17:00:00     tuesday
7           2016-03-11 18:00:00     tuesday


bookings
    id      id_class    date                    day         name    
    1       2           2016-03-10 16:00:00     monday      Fredrik
    2       5           2016-03-11 16:00:00     tuesday     Richard
    3       7           2016-03-11 18:00:00     tuesday     Sara
    4       4           2016-03-11 15:00:00     tuesday     Fredrik

然后我想要一个php代码,它遍历整个"classes"表,并向登录者(Fredrik)显示他预订了哪些课程,以及他没有预订哪些课程。我从一个简单的while循环和一些if语句开始。我需要帮助来完成这个代码。此外,这两张表都可能很大,因此效率建议非常受欢迎。

    <?php
        $result = $con->query("select * from classes");
        while(){
        if(){
            echo "Booked";
        }elseif(){
            echo "Not booked";
        }       
        }
<?

所以我一直以来都是一个结果表,看起来有点像

result table
id_class     date                    day        status           
1           2016-03-10 15:00:00     monday      not booked
2           2016-03-10 16:00:00     monday      booked
3           2016-03-10 17:00:00     monday      not booked
4           2016-03-11 15:00:00     tuesday     booked
5           2016-03-11 16:00:00     tuesday     booked
6           2016-03-11 17:00:00     tuesday     not booked
7           2016-03-11 18:00:00     tuesday     booked

首先:关于课程日期和日期的信息是多余的(classesbookings表中存在相同的信息)。从bookings表中删除该冗余信息。

然后,使用这个SQL查询作为示例(未测试):

SELECT `c`.`date`, `c`.`day` FROM `bookings` AS `b` INNER JOIN `classes` AS `c` ON `b`.`id_class` = `c`.`id` WHERE `b`.`name` = '[loggedInUser]';

(用您登录的用户名替换[loggedInUser],最好用PDO准备的语句,或者至少用mysqli转义!)

您不需要php来解决这个问题。在这种情况下,您需要左联接。

SELECT a.id_class, a.date, a.day, b.booking_id, b.name FROM classes a LEFT JOIN bookings b ON a.idclass=b.id_class WHERE b.name="Frederick"