最重要的是!这个问题的重点是末尾的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
首先:关于课程日期和日期的信息是多余的(classes
和bookings
表中存在相同的信息)。从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"