Как можно игнорировать строку из таблицы, если один из столбцов связанной таблицы не соответствует условию? - PullRequest
0 голосов
/ 13 мая 2011

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

У меня есть таблицы Student и Courses.Студент -> Курсы - это отношение один-ко-многим.

  Student                   Course
|--------------|   |--------------------------------------| 
|id| name      |   |id | course_name | grade | student_id | 
|----------    |   |--------------------------------------| 
|S1| student 1 |   |C1 | Course1     | A     | S1         |
|S2| student 2 |   |C2 | Course2     | C     | S1         |
|----------    |   |C3 | Course1     | A     | S2         |
                   |C4 | Course2     | B     | S2         |
                   |--------------------------------------|
select * from Student 
where id NOT IN (select student_id from Course where grade = 'C')

Я хочу достичь того же результата с помощью одного оператора SQL JOIN или activerecord.

Ответы [ 2 ]

1 голос
/ 13 мая 2011
SELECT * FROM Student s 
LEFT JOIN Course c ON s.id=c.student_id AND c.grade = 'C' 
WHERE c.student_id IS NULL;

Или присоединиться к вашему подзапросу

SELECT * FROM Student s 
LEFT JOIN (SELECT student_id FROM Course WHERE grade = 'C') c
WHERE c.student_id IS NULL;

Или использование существует

SELECT * FROM Student s 
WHERE NOT EXISTS (SELECT NULL FROM Course WHERE grade = 'C' AND student_id=s.id);

Боюсь, я не могу проверить это в данный момент, и у меня есть подозрениечто эти запросы могут вам не помочь.У меня нет опыта работы с ActiveRecord.Дайте мне знать в комментариях.

0 голосов
/ 13 мая 2011

оракул:

select distinct s.*  from student s left join course c on c.student_id=s.id where c.grade!='c'


Student.all(:select=>"distinct student.*",:joins=>"left join course on course.student_id=student.id",:conditions=>"course.grade!='c'")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...