2016-04-15 18 views
0

Hier sind die Inhalte der Tabellen.Wie NULL-Werte zurückgegeben werden, wenn mehrere Tabellen verbunden werden

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 |  | 
+------------+------------------+------+-----+---------+-------+ 

Was ich versuche zu erreichen, anzuzeigen, welche Schüler ein Quiz/Test verpasst haben, unter ‚Kategorie‘ Tabelle in der grade_event gefunden.

Hier ist, was ich mir ausgedacht habe, aber keine Ergebnisse erziele;

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; 

Ich habe auch den Weg der Versuch einer Unterabfrage gegangen;

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; 

Jede Hilfe würde geschätzt.

Antwort

0

Sie benötigen einen Außen verwenden verbinden anstelle einer inneren Verknüpfung Liste der Schüler zu erhalten, die nicht über ein entsprechender Datensatz in den Ereignissen nach dem Erstellen eines Carthesian Join von Studenten und Ereignissen:

1

Ich denke, Sie sollten nur ersetzen Ihre join von left join, join ein inner join in MySQL ist: http://dev.mysql.com/doc/refman/5.7/en/join.html

Und darauf achten, mit group by event_id, kann es auf präzise group by sc.event_id nützlich sein. Ich weiß nicht in MySQL, aber in SQL Server würde es nicht funktionieren.

Ihre zweite Abfrage ist unbedingt leer wie Sie eine Spalte stellen ihre Werte haben, nicht in ihren Werten :)

+0

Ich machte die vorgeschlagenen Änderungen, aber ich gebe immer noch eine leere Reihe von Ergebnissen. Mit der Unterabfrage macht das Sinn. Was wäre eine bessere Möglichkeit zur Abfrage? –

+0

Ersetzen der beiden Joins durch Links Join funktioniert nicht? Vielleicht ist es Differenzen zwischen SQL-Server und MySQL, es würde in SQL arbeiten, wie ich verstehe, wie Ihre Tabellen erstellt werden. Wie auch immer, @Shadow lieferte eine funktionierende Lösung – BD01

Verwandte Themen