1

好的,我认为这个问题的答案在某个地方,但我找不到它......(甚至我的标题也很糟糕)

简而言之,我想从关联表的一部分中获得最少数量的组


第一,请记住,这已经是 5 个表(+1k 行)加入过滤器和分组的结果,我必须在像香蕉一样强大的产品服务器上运行很多次......

2nd, 这是一个假的案例,你的问题是我的问题


经过一些查询,我得到了这个数据结果:

+--------------------+
|id_course|id_teacher|
+--------------------+
|    6    |    1     |
|    6    |    4     |
|    6    |    14    |
|   33    |    1     |
|   33    |    4     |
|   34    |    1     |
|   34    |    4     |
|   34    |    10    |
+--------------------+

如您所见,我有 3 门课程,女巫由多达 3 位老师教授。我需要参加每一门课程,但我希望尽可能少的不同老师(我很害羞......)。

我的第一个查询

应该回答: 每门独特的课程我需要最少的老师人数是多少?

有了这个数据,它是一个1,因为教师 1 或教师 4 为这 3 人制作课程。


第二次查询

现在我已经获得了这些课程,我想按照以下时间表参加另外两门课程,the32和 the 50

+--------------------+
|id_course|id_teacher|
+--------------------+
|   32    |    1     |
|   32    |    12    |
|   50    |    12    |
+--------------------+

我的问题是:对于 id_course N,我需要再找一位老师吗?

我想按课程检查,所以“检查课程 32”,无需同时检查多个

我认为最好的方法是使用第一个查询中排名最低的教师列表来计算内部连接,所以我们的数据只有两个:Teacher(1, 4)

对于 Course 32, Teacher2 不做这个,但作为 Teacher1 做,Courses(6, 33, 34, 32)我不必再找另一位老师。

对于 Course 50,唯一的老师是 Teacher12,所以我不会在我选择的老师中找到匹配的,我必须再找一个(所以这些数据总共有两个)


这是一个基础 [SQLFiddlesqlfiddle

最好的问候,布拉格

4

2 回答 2

1

你想获得一个不同的 ID_Teachers 计数,然后......获得一个不同的计数并将结果限制为 1 条记录。

所以也许像......

SELECT count(Distinct ID_Teacher), Group_concat(ID_Teacher) as TeachersIDs
FROM  Table
WHERE ID_Course in ('Your List')
ORDER BY count(Distinct ID_Teacher) ASC Limit 1

但是,如果存在平局,这将随机选择...所以您是否要提供选项来选择应该存在平局的教师组和班级?这意味着有多种途径可以完成涉及相同数量教师的所有课程……例如,教师 A、B 和 A、C 完成所有要求的课程……这两个记录应该在结果中返回还是 1 就足够了?

于 2015-11-16T15:15:06.857 回答
1

所以我终于找到了一种方法来做我想做的事!

对于第一个查询,由于我潜在的真正需求是“是否有一个老师可以做所有事情”,所以我降低了一些期望并选择了这个(在我的真实案例 u_u 上为 58 行):

SELECT
    (
        SELECT count(s.id_teacher) nb
        FROM t AS m
        INNER JOIN t AS s
            ON m.id_teacher = s.id_teacher
        GROUP BY m.id_course, m.id_teacher
        ORDER BY nb DESC
        LIMIT 1
        ) AS nbMaxBySingleTeacher,
    (
        SELECT COUNT(DISTINCT id_course) nb
        FROM t
        ) AS nbTotalCourseToDo

[SQLFiddlesqlfiddle

我得到了两个值来回答我的问题“一位老师就够了吗?”

+--------------------------------------+
|nbMaxBySingleTeacher|nbTotalCourseToDo|
+--------------------------------------+
|         4          |        5        |
+--------------------------------------+

第二个查询使用新课程的时间表,并获取我要检查的课程的 ID。它应该告诉我是否需要再找一位老师,或者我的实际老师是否可以。

SELECT COUNT(*) nb
FROM (
    SELECT
        z.id_teacher
    FROM z
    WHERE
        z.id_course = 50
    ) t1
WHERE
    FIND_IN_SET(t1.id_teacher, (
        SELECT GROUP_CONCAT(t2.id_teacher) lst
        FROM (
            SELECT DISTINCT COUNT(s.id_teacher) nb, m.id_teacher
            FROM t AS m
            INNER JOIN t AS s
                ON m.id_teacher = s.id_teacher
            GROUP BY m.id_course, m.id_teacher
            ORDER BY nb DESC
            ) t2
        GROUP BY t2.nb
        ORDER BY nb DESC
        LIMIT 1
        ));

[SQLFiddlesqlfiddle

这告诉我有多少老师能够教授我已经拥有的课程和我想要的新课程。因此,如果它超过零,那么我不需要新老师:

+--+
|nb|
+--+
|1 |
+--+
于 2015-11-18T16:50:28.923 回答