2016-05-16 9 views
-3

Ich bin neu in diesem, deshalb habe ich wenig Ahnung, wie das funktioniert, aber ich einen Fehler mit diesem mit:MySQL beitreten - unbekannte Spalte in ‚on-Klausel‘

USE database; 
SELECT students.last_name, students.first_name, 
     subjects.subject_name, entries.date_of_exam 
FROM students, 
    entries, 
    subjects 
     JOIN entries e1 
     on (e1.student_id = students.student_id) 
     AND students.last_name IN (SELECT students.student_id FROM students) 
     JOIN entries e2 on (e2.subject_id = subjects.subject_id) 
ORDER BY last_name; 

Dies kommt mit dem Fehler

Fehlercode: 1054 Unknown column 'students.student_id' in 'on-Klausel'

obwohl, dass der Name der Spalte ist, so sollte es funktionieren?

Was ich versuche zu tun ist, alle Einträge für alle Schüler anzuzeigen, wo jeder Schüler mehr als einen Eintrag hat, und zeigen Sie auch die Fächer.

+1

Sie machen kartesische Produkte an Studenten, Einträgen und Fächern. Das kann nicht sein, was du willst, oder? Versuchen Sie nicht, durch Komma getrennte Tabellen im alten Stil und den ANSI-Join-Stil zu mischen. – trincot

+0

zumindest dieser Teil wird definitiv nicht funktionieren 'UND students.last_name IN (SELECT students.student_id FROM Studenten)' weil last_name ist student_id –

+1

Und das ergibt keinen Sinn: 'students.last_name IN (SELECT students.student_id VON Studenten)' . Sie möchten einen Namen, der einer Studenten ID entspricht? – trincot

Antwort

0

versuchen, mit so etwas wie:

SELECT students.last_name, students.first_name, subjects.subject_name, entries.date_of_exam 
FROM students 
INNER JOIN entries ON entries.student_id = students.student_id 
INNER JOIN subjects ON subjects.subject_id = entries.subject_id 
WHERE students.student_id IN (SELECT student_id FROM entries GROUP BY student_id HAVING COUNT(entries.subject_id) > 1)  
ORDER BY last_name; 
0

Sie kein Komma getrennte Liste von Tabellen in der from Klausel und fügen Sie dann join verwenden sollte. Die durch Komma getrennte Liste erstellt das vollständige kartesische Produkt aller Datensätze in allen drei Tabellen. Das wird nur die Anzahl der Kombinationen explodieren lassen und Dinge in Ihrer Ausgabe in Beziehung setzen, die nichts miteinander zu tun haben.

Der join Teil ist auch seltsam, wie Sie bereits entries haben und dann wieder doppelt in es ... Es gibt nichts in Ihrer Abfrage, die darauf hindeutet, dass Sie tatsächlich drei Mal diese Tabelle benötigen.

Außerdem macht die Join-Bedingung students.last_name IN (SELECT students.student_id FROM students) keinen Sinn, da der Name des Schülers mit der ID eines anderen (oder des gleichen) Schülers übereinstimmen muss. Gibt es einen Schüler, der vielleicht 007 heißt?

Sie wahrscheinlich nur eine Abfrage wie folgt, die für jeden Schüler alle Informationen nimmt, schließt sich dann mit einer Abfrage, die die Anzahl Einträge pro Schüler wählt, und schließlich filtert für die Fälle, in denen diese Zählung größer ist als 1:

SELECT s.last_name, 
     s.first_name, 
     s.subject_name, 
     e.date_of_exam 
FROM  students s 
JOIN  entries e 
     ON s.student_id = e.student_id 
JOIN  subjects s 
     ON e.subject_id = s.subject_id 
JOIN  (SELECT student_id, count(*) entry_count 
      FROM  entries 
      GROUP BY student_id) cnt 
     ON cnt.student_id = s.student_id 
WHERE cnt.entry_count > 1 
ORDER BY 1, 2, 3, 4; 
Verwandte Themen