Mysql - 获取具有最低关系计数的行

时间:2018-02-15 21:15:40

标签: mysql sql algorithm

我有两个mysql表:

    列<{1}} 的
  1. 教师
  2. 学生id, name, age,其中name, age, teacher_id是指定学生的教师的ID。
  3. 现在,教师之间的负担应该是平均分配的。每当新学生被添加到系统中时,我需要为其分配一个最不忙的教师,即分配给它的学生人数最少。

    有这么快的方法吗?最初,我以为我可以使用teacher_id并按计数对其进行排序。但是,这遗漏了没有任何学生分配给他们的教师。

    如果我们正在使用联接,如果学生表有100万行,性能如何?

2 个答案:

答案 0 :(得分:1)

你只需要一个外部联接来包括没有学生的教师。

select t.id, t.name
from teacher t
left join student s on t.id = s.teacher_id
group by t.id
order by count(s.name)
limit 1

你可以使用非规范化(每个教师预先计算出的学生数量的专栏),然而,这是一个坏习惯,如果它不是真的不可避免,我不会推荐它。

答案 1 :(得分:1)

如果你想要一个非常快速的方式&#34;这样做,我会建议一个小的重新设计。

实施触发器以维持所有教师的当前学生人数。这将是一个新列,{。1}},比方说。

在学生计数上加上一个索引,然后执行:

student_count

我不是触发器的忠实粉丝,但是当它们有用时,它们确实非常有用。您遇到性能问题,需要沿层次结构聚合数据。您需要学生select t.* from teachers t order by student_count asc limit 1; insertupdate的触发器。