2016-07-28 66 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来完成的吗?作为一个额外的好处,这可以用flask-sqlalchemy完成吗?

我有一个想法,我需要做一个JOIN和ORDER BY,但我真的不知道该去哪里。

谢谢!

回答

2

,你必须使用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中,你可能会如果你使用SQLite考虑这样的事情

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

相关问题