SQL Заявление на поиск только тех курсов, на которых текущий пользователь не зарегистрирован - PullRequest
1 голос
/ 11 марта 2020

Я занимаюсь разработкой веб-приложения, которое отслеживает записи обучения сотрудников в рамках моего универкурса.

Я использую phpMyadmin и MySQLi.

У меня есть 3 таблицы базы данных tblUser, tblCourse и tblBookings.

tblUser имеет столбцы UserID, First_Name, Last_Name, Email, Access_Level

tblCourse имеет CourseID, Course_Title, Course_Start_Time, Course_Duration, Course_Description

только 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 я хотел бы заполнить таблицу только сведениями о курсе Course с 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  

Но это по-прежнему подтягивает курсы, на которых зарегистрирован пользователь, если на этот курс записаны другие пользователи.

Ответы [ 3 ]

1 голос
/ 11 марта 2020

Попробуйте подзапрос:

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
)
1 голос
/ 11 марта 2020

Вам необходимо 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 сохранит только несопоставленные строки, которые являются курсами, в которых этот пользователь не зарегистрировался. См. Упрощенную демонстрацию .

0 голосов
/ 11 марта 2020

Вам нужно сделать 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)
...