2015-12-01 44 views
1

發現我在我的數據庫6個表:userscoursesusers_courseslecturesusers_lecturesattends。在標題中,我將它們分別稱爲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"); 

我缺少的東西或以錯誤的方式思考整個結構?

對不起,提供這麼長的文字,但我想盡可能具體。任何幫助將不勝感激:)

+0

使用WHERE子句過濾LEFT JOINed表可以將它們變成INNER JOIN。嘗試將您的限制移動到相關表的ON子句。 – reaanb

+0

按照我的理解來重新解釋這個問題: 查找屬於某個學生選擇的課程的講座(即,在student_courses中有一個記錄,映射到講座表),該學生尚未參加(即出席時沒有記錄)。 –

+0

你明白了嗎 –

回答

1

首先,你需要從你想要返回的主題開始。這將是用戶。因此,這將是你的第一個表,從中選擇(這裏注意:使用AS重命名爲簡潔表):

Select * 
From users AS u 

下一頁鏈接在一起,你想要的數據。取決於你想要的具體方式取決於你需要做多少連接(例如courseID vs CourseName)。

現在假設我們需要大量人類可讀的數據,例如名稱,我們將鏈接下列表格。

LEFT OUTER JOIN users_lectures AS ul ON u.id = ul.userid 
LEFT OUTER JOIN lectures AS l ON l.id = ul.lectureid 
LEFT OUTER JOIN courses AS c ON c.id = l.courseid 
LEFT OUTER JOIN attends AS a ON a.userid = u.id AND a.lectureid = l.id 

而且最糟糕的是,發現誰沒有參加的人,他們不會在出席表,所以我們只是檢查的人,其中的值是空的出席。

WHERE a.userid IS NULL 

作爲一個側面說明,你會不會與此WHERE子句

AND attends.lecture_id != users_lectures.lecture_id 

中得到任何結果,因爲你用這個說法

LEFT JOIN attends ON attends.lecture_id = users_lectures.lecture_id 

這相互矛盾加盟

+0

謝謝先生:)結果就像我想成爲的! –

相關問題