2016-04-15 28 views
0

這裏是表格的內容。如何在加入多個表時返回NULL值

mysql> desc student; 
+------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+------------+------------------+------+-----+---------+----------------+ 
| name  | varchar(20)  | NO |  | NULL |    | 
| sex  | enum('F','M') | NO |  | NULL |    | 
| student_id | int(10) unsigned | NO | PRI | NULL | auto_increment | 
+------------+------------------+------+-----+---------+----------------+ 

mysql> desc grade_event; 
+----------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+----------+------------------+------+-----+---------+----------------+ 
| date  | date    | NO |  | NULL |    | 
| category | enum('T','Q') | NO |  | NULL |    | 
| event_id | int(10) unsigned | NO | PRI | NULL | auto_increment | 
+----------+------------------+------+-----+---------+----------------+ 

mysql> desc score; 
+------------+------------------+------+-----+---------+-------+ 
| Field  | Type    | Null | Key | Default | Extra | 
+------------+------------------+------+-----+---------+-------+ 
| student_id | int(10) unsigned | NO | PRI | NULL |  | 
| event_id | int(10) unsigned | NO | PRI | NULL |  | 
| score  | int(11)   | NO |  | NULL |  | 
+------------+------------------+------+-----+---------+-------+ 

我想要完成的是顯示哪些學生錯過了在grade_event表中'category'下找到的測驗/測驗。

這是我想到的,但沒有產生任何結果;

select name, category, sc.event_id 
from student s 
join score sc on s.student_id=sc.student_id 
join grade_event ge on sc.event_id=ge.event_id 
where score is NULL 
group by name, event_id; 

我也走了嘗試子查詢的路線;

select name, category, sc.event_id 
from student s 
join score sc on s.student_id=sc.student_id 
join grade_event ge on sc.event_id=ge.event_id 
where score not in (select score from score) 
group by name, event_id; 

任何幫助,將不勝感激。

回答

0

它不是值您需要使用外連接,而不是內部的加入讓沒有學生的名單

你的第二個查詢是必然空創建學生和事件的carthesian加入後的事件中的相應記錄:

select name, category, ge.event_id 
from (student s 
join grade_event ge) --no join condition creates a carthesian join 
left join score sc on s.student_id=sc.student_id and sc.event_id=ge.event_id 
where sc.score is NULL 
1

我想你應該只需更換您的join通過left joinjoin是在MySQL的inner joinhttp://dev.mysql.com/doc/refman/5.7/en/join.html

,照顧與group by event_id,它可以精確的group by sc.event_id有用。我不知道在MySQL中,但在SQL Server中它不會工作。當你問一個列有其價值:)

+0

我提出了建議的更改,但我仍然返回一組空的結果。 使用子查詢,這是有道理的。什麼是更好的查詢方式? –

+0

通過左連接替換兩個連接不起作用?也許這是SQL服務器和MySQL之間的差異,它會在SQL中工作,因爲我知道你的表是如何創建的。無論如何,@Shadow似乎提供了一個可行的解決方案 – BD01