2009-12-16 142 views
0

假设我们有两个实体:教师和学生。SQL问题,挑战

每位老师有多个学生。

现在我想:

查询最多5名教师,并为每一位教师,不超过他的学生10。

到目前为止,这可以很容易地通过做:

select *, 
(
select GROUP_CONCAT('<sid>',students.name,'</sid>') from students on 
teachers.id=students.teacher limit 10 
) as students 
from teachers limit 5 

但是,这并不是故事的全部呢。

如果教师的人已超过10名学生,应该返回true为老师,否则false

如何做到这一点的SQL?

+0

请准确。产生的关系应具有什么样的标题? – 2009-12-16 04:48:55

+1

这是什么数据库? – 2009-12-16 04:49:27

+0

伪代码就足够了。 – user198729 2009-12-16 04:50:01

回答

0

伪SQL:结果每一行对应一个10名学生的每个5名教师的

select t.teacher_id, s.student_id, 
    case when t2.count > 10 then 'true' else 'false' end 
from 
    (select top 5 * 
    from teachers 
    order by teacher_id) t 
join 
    (select top 10 * 
    from students s1 join teachers t1 on s1.teacher_id = t1.teacher_id 
    order by student_id) s 
on t.teacher_id = s.teacher_id 
join 
    (select teacher_id, count(*) as count 
    from teachers t join students s on t.teacher_id = s.teacher_id 
    group by teacher_id) t2 
on t2.teacher_id = t.teacher_id 
+0

我不认为第二个子查询是正确的(在再次看这个之后)。它只会返回10名学生,而不是每位教师10名学生。 – ecounysis 2009-12-16 05:20:13

+0

您只会下注10名学生,而不是每位教师10名学生 – 2009-12-16 05:50:32

0

使用子查询选择的每一位老师。

+0

对不起,我遗漏了最重要的东西,看我的更新。 – user198729 2009-12-16 04:55:57