Mysql Help - Left join - PullRequest
       13

Mysql Help - Left join

2 голосов
/ 11 апреля 2011

Я обычно читаю другие темы, и это мой первый вопрос здесь.Вот оно;

Я пытаюсь создать запрос, который включает две таблицы: таблицу курсов и таблицу StudentsLink.Таблица StudentsLink описывает связь между студентами и курсом.Таблицы приведены ниже:

Course    
courseID(bigint) - PK
courseName (varchar)
courseInstructor (varchar)

StudentsLink
courseID(bigint) - PK
StudentID(bigint) - PK

Below is some sample data;

course table

ID | courseName| courseInstructor
----------------------------------
1  | Algebra 1 | Mike
2  | English 2 | James
3  | English 3 | John
4  | Algebra 2 | Mike
5  | History 1 | Tony

Studentlink table

studentID | courseID  
----------------------
100       | 2         
101       | 3         
102       | 3        
102       | 4         
103       | 4         
100       | 1         
103       | 3         
103       | 2         

Желаемый результат такой же, как приведенный ниже, если я искал ученика номер 103

ID | courseName| courseInstructor |StudentID | CourseID 
---------------------------------------------------------
1  | Algebra 1 | Mike             | NULL     | NULL
2  | English 2 | James            | 103      | 2
3  | English 3 | John             | 103      | 3
4  | Algebra 2 | Mike             | 103      | 4
5  | History 1 | Tony             | NULL     | NULL

Запрос, который у меня пока есть, следующий:

SELECT * 
FROM course
LEFT JOIN studentLink 
ON course.courseID = studentLink.courseID
WHERE studentLink.studentID = 103 OR (studentLink .studentID IS NULL AND studentLink.courseID IS NULL)
ORDER BY studentLink.courseID DESC

Я в основном пытаюсь получить набор результатов из всех доступных курсов, какой из них является конкретным студентом, а какой нет, поэтому я смогу отобразить его каккурс, который мы можем предложить студенту.

Я перепробовал много вариантов этого запроса и провел некоторое исследование.Я не совсем прошу кодез, но немного рекомендаций было бы замечательно.Я застрял в этом несколько дней, пытаясь одновременно работать над другими частями проекта.

Любая помощь очень ценится.Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 11 апреля 2011
SELECT ID, CourseName, CourseInstructor, StudentId, CourseId 
FROM Courses as c 
LEFT JOIN StudentLink as sl ON c.id = sl.CourseId  And StudentId = 103 
1 голос
/ 11 апреля 2011

Проблема здесь в том, что вы присоединяетесь, а затем фильтруете, вам нужно фильтровать в точке объединения

SELECT * 
FROM course
LEFT JOIN studentLink 
ON course.courseID = studentLink.courseID and studentLink.studentID = 103
ORDER BY course.courseID DESC

Это должно работать (при условии, что mysql позволяет вам иметь несколько предикатов в логике соединения, думаю, что это так, но не имеет экземпляра для тестирования)

Если вы не можете присоединиться к подзапросу, который применяет ограничение для вас.

SELECT * 
FROM course
LEFT JOIN 
(select * from studentLink where studentID = 103) as sl
ON course.courseID = sl.courseID
ORDER BY course.courseID DESC
0 голосов
/ 11 апреля 2011

Вы можете легко получить список учеников, используя ваше левое соединение (без или где)

Затем вы можете получить других, где вы используете не в качестве части союза ...

после первой части запроса вы можете сделать что-то вроде ...

SELECT *  FROM course LEFT JOIN studentLink  ON course.courseID = studentLink.courseID WHERE studentLink.studentID = 103

union

select * FROM course LEFT JOIN studentLink  ON course.courseID = studentLink.courseID 
WHERE courseID NOT IN ( select course.courseID FROM course LEFT JOIN studentLink  ON course.courseID = studentLink.courseID WHERE studentLink.studentID = 103)

Это, вероятно, потребует некоторой настройки, я не уверен в точном синтаксисе, но это возможная идея о том, как получить то, что вам нужно.

...