2016-07-28 2 views
1

Рассмотрим следующие таблицы:Выбрать и заказать записи в один ко многим отношений

Student 
------- 
id 
name 

и

Assignment 
---------- 
id 
name 

и

Grade 
----- 
id 
student_id 
assignment_id 
grade 

Студент может иметь несколько классов, соответствующих различным задания.

Теперь я хочу, чтобы выбрать записи, чтобы создать таблицу, которая выглядит следующим образом:

Name  Assignment 1  Assignment 2 Assignment 3 
-------------------------------------------------------- 
Bob  55%    80%    23% 
Suzy  90%    65%    100% 

И я хочу, чтобы иметь возможность сортировать по одному из классов (то есть присвоение 1)

Это что-то, что можно сделать с SQL? Как дополнительный бонус, это можно сделать с помощью фляжки-sqlalchemy?

У меня есть идея, мне нужно сделать JOIN и ORDER BY, но я не знаю, с чего это пойдет.

Спасибо!

ответ

2

Если вы используете SQLite, вы должны использовать наименьший общий знаменатель SQL, а это означает объединение для каждого присваивания вы хотите, чтобы рассмотреть:

SELECT 
    name, 
    Grade1.grade AS assignment1, 
    Grade2.grade AS assignment2, 
    Grade3.grade AS assignment3 
FROM 
    Student 
    LEFT JOIN Grade AS Grade1 ON (Student.id = Grade1.student_id and Grade1.assignment_id = ...) 
    LEFT JOIN Grade AS Grade2 ON (Student.id = Grade2.student_id and Grade2.assignment_id = ...) 
    LEFT JOIN Grade AS Grade3 ON (Student.id = Grade3.student_id and Grade3.assignment_id = ...) 
ORDER BY Grade1.grade 

Перевести это на SQLAlchemy должно быть простым.

+0

Спасибо @univerio! Я придерживаюсь такого подхода и, похоже, работает до сих пор – ian93

0

В Oracle вы можете рассмотреть что-то вроде этого

with 
    tab as(
    select s.name as student, a.name as assignment, g.v as grade 
     from grade g 
      inner join student s on g.s_n = s.n 
      inner join assignment a on g.a_n = a.n 
) 
select * 
    from tab 
    pivot (min(grade) for assignment in ('Assignment 1', 'Assignment 2', 'Assignment 3')) 
order by 2, 3 desc, 7 
+0

К сожалению, я не использую Oracle ... но спасибо – ian93

+0

@ ian93 Не возражаете ли вы не догадываться, какую базу данных вы используете? – univerio

+0

Извините - я использую SQLite, но я действительно ищу решение sqlalchemy! – ian93

Смежные вопросы