發現我在我的數據庫6個表:users
,courses
,users_courses
,lectures
,users_lectures
和attends
。在標題中,我將它們分別稱爲A,B,C,D,E和F.MySQL的 - 從關係表中A,B,C,d,E選擇數據記錄,如果沒有在表F
我創建了一個作爲我學校項目一部分的講座參加系統,我需要運行一個查詢只有那些用戶尚未參加的講座。
users
表中保存有關用戶的信息。其表結構如下:
id INT(10) USINGNED PRIMARY KEY AUTO_INCREMENT
name VARCHAR(255)
email VARCHAR(255)
password VARCHAR(60)
created_at TIMESTAMP
updated_at TIMESTAMP
courses
表是講座父表,其中的講座屬於它包含有關課程的信息。其表結構如下:
id INT(10) UNSIGNED AUTO_INCREMENT
name VARCHAR(255)
created_at TIMESTAMP
updated_at TIMESTAMP
users_courses
是用戶和課程之間的關係表。它將用戶鏈接到課程。其表結構如下:
user_id INT(10) UNSIGNED FOREIGN KEY
course_id INT(10) UNSIGNED FOREIGN KEY
lectures
表保存有關即將舉行的講座用戶都應該參加信息。它的表結構如下:
id INT(10)
starting_at DATETIME
ending_at DATETIME
course_id INT(10) UNSIGNED FOREIGN KEY
created_at TIMESTAMP
updated_at TIMESTAMP
users_lectures
表用戶和講座之間的關係表。它將講座與用戶聯繫起來。其表結構如下:
user_id INT(10) UNSIGNED FOREIGN KEY
lecture_id INT(10) UNSIGNED FOREIGN KEY
attends
表保存有關用戶參加的用戶的ID,講座的ID和時間戳created_at和的updated_at信息。其表結構如下:
user_id INT(10) UNSIGNED FOREIGN KEY
lecture_id INT(10) UNSIGNED FOREIGN KEY
created_at TIMESTAMP
updated_at TIMESTAMP
問:
是否有可能,有一個查詢,選擇只在用戶還沒有參加那些即將到來的演講?
下面是我嘗試過,但它不返回任何行:
// PHP
$stmt = $pdo->prepare("
SELECT
courses.name AS course,
lectures.id AS id,
lectures.starting_at,
lectures.ending_at,
users.name AS user_name,
users_lectures.user_id
FROM lectures
LEFT JOIN users_courses ON users_courses.course_id = lectures.course_id
LEFT JOIN courses ON courses.id = users_courses.course_id
LEFT JOIN users_lectures ON users_lectures.lecture_id = lectures.id
LEFT JOIN users ON users.id = users_lectures.user_id
LEFT JOIN attends ON attends.lecture_id = users_lectures.lecture_id
WHERE users_lectures.user_id = :user_id
AND lectures.ending_at > DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 1 MINUTE)
AND lectures.ending_at > DATE_ADD(CURRENT_TIMESTAMP, INTERVAL 1 MINUTE)
AND attends.lecture_id != users_lectures.lecture_id
AND attends.user_id != :user_id
ORDER BY lectures.starting_at DESC");
我缺少的東西或以錯誤的方式思考整個結構?
對不起,提供這麼長的文字,但我想盡可能具體。任何幫助將不勝感激:)
使用WHERE子句過濾LEFT JOINed表可以將它們變成INNER JOIN。嘗試將您的限制移動到相關表的ON子句。 – reaanb
按照我的理解來重新解釋這個問題: 查找屬於某個學生選擇的課程的講座(即,在student_courses中有一個記錄,映射到講座表),該學生尚未參加(即出席時沒有記錄)。 –
你明白了嗎 –