SQL语句,仅查找当前用户未注册的课程



我正在开发一个网络应用程序,作为我大学课程的一部分,它可以跟踪员工的培训记录。

我使用的是phpMyadmin和MySQLi。

我有三个数据库表tblUser、tblCourse和tblBookings。

tbl用户具有UserID、First_Name、Last_Name、Email、Access_Level列

tbl课程有CourseID、Course_Title、Course_Start_Time、Course_Duration、Course-Description、Max_Attendees列

tblBookings只包含BookingID、CourseID和UserID,它们链接到其他两个表中的相关用户/课程。

tblBookings looks something like this
+-----------+----------+--------+
| BookingID | CourseID | UserID |
+-----------+----------+--------+
|         1 |        1 |      1 |
|         2 |        1 |      2 |
|         3 |        1 |      3 |
|         4 |        2 |      2 |
|         5 |        2 |      3 |
|         6 |        3 |      1 |
+-----------+----------+--------+

我正试图编写一条SQL语句来填充一个表,该表只显示当前用户未注册的课程。因此,在UserID为1的上述场景中,我想用CourseID为2的课程的课程详细信息填充一个表,因为这是他唯一没有注册的课程。

我得到的最接近的说法是:

SELECT `tblCourseAdmin`.`CourseID`, `Course_Title`, `Course_Date`, `Course_Start_Time`, `Course_Duration`, `Course_Description`, `Max_Attendees`
FROM `tblCourseAdmin`
INNER JOIN `tblBookings`
ON `tblCourseAdmin`.`CourseID` = `tblBookings`.`CourseID`
WHERE`tblBookings`.`UserID` != 1  

但如果有其他用户注册了该课程,这仍然会调出用户注册的课程。

您需要一个LEFT联接并过滤掉匹配的行:

SELECT c.*
FROM `tblCourseAdmin` c LEFT JOIN `tblBookings` b
ON c.`CourseID` = b.`CourseID` AND b.`UserID` = 1
WHERE b.`UserID` IS NULL 

条件b.UserID = 1将只将表加入该用户已注册的课程,条件WHERE b.UserID IS NULL将只保留不匹配的行,这些行是该用户已注册的课程
查看简化的演示。

尝试一个子查询:

SELECT `tblCourseAdmin`.`CourseID`, `Course_Title`, `Course_Date`, `Course_Start_Time`, `Course_Duration`, `Course_Description`, `Max_Attendees`
FROM `tblCourseAdmin`
WHERE CourseID NOT IN (
SELECT CourseID FROM tblBookings WHERE UserID = 1
)

您需要执行LEFT JOIN(或右联接(。LEFT JOIN获取一个表并将其匹配到另一个表,无论如何。当不匹配时,第二个表的列将获得NULL。

如果你这样做了,

SELECT * 
FROM tblUser
JOIN tblCourse

在没有JOIN条件的情况下,它将拉取所有用户和所有课程。

现在添加

LEFT JOIN tblBookings ON (tblUser.UserID = tblBookings.UserID AND tblBookings.CourseID = tblCourse.CourseID)

这将引入所有用户和所有课程,并且在没有该用户和该课程的预订的情况下,tblBookings列将为NULL

所以您现在只需添加一个WHERE条件

WHERE (tblBookings.UserID IS NULL OR tblBookings.CourseID IS NULL)

并获取有用户、有课程但该用户未注册该课程的行。你想要的似乎是什么?

更新

对不起,这不是你想要的,但很接近。您需要以上内容,用于当前用户。所以你根本不需要加入用户表:

SELECT * 
FROM tblCourse
LEFT JOIN tblBookings ON (tblUser.UserID = CURRENT_USER_ID AND tblBookings.CourseID = tblCourse.CourseID)
WHERE (tblBookings.CourseID IS NULL)

最新更新