【问题标题】:Mysql - Get row with lowest relation countMysql - 获取关系计数最低的行
【发布时间】:2018-02-15 21:15:39
【问题描述】:

我有两个mysql表:

  1. 教师与列id, name, age
  2. Student 包含 name, age, teacher_id 列,其中 teacher_id 是分配学生的老师的 ID。

现在,教师之间的负担应该平均分配。每次将新学生添加到系统时,我都需要为其分配一个最不忙的老师,即分配给它的学生人数最少。

有没有真正快速的方法来做到这一点?最初,我认为我可以使用group by teacher_id 并按计数对其进行排序以获取它。但是,这会排除尚未分配任何学生的教师。

如果我们使用连接,如果学生表有 100 万行,性能会如何?

【问题讨论】:

    标签: mysql sql algorithm


    【解决方案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
    

    您可以使用非规范化(预先计算每个教师的学生人数的列),但是,这是一个坏习惯,如果不是真的不可避免,我不会推荐它。

    【讨论】:

    • 如果学生表中有大约 100k 条记录,它的性能会如何?是的,我忘了提到教师表中的 id 列
    • 如果你确实在 PRIMARY KEY 上分组而不是查询是正确的
    【解决方案2】:

    如果您想要一种“非常快速的方式”来做到这一点,那么我建议您进行小的重新设计。

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

    为学生人数建立一个索引,然后简单地做:

    select t.*
    from teachers t
    order by student_count asc
    limit 1;
    

    我不是触发器的忠实粉丝,但是当它们有用时,它们真的很有用。您遇到了性能问题,需要沿层次结构聚合数据。您需要针对学生的insertupdatedelete 触发器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      相关资源
      最近更新 更多