最少分组的不同 - SQL

时间:2015-11-16 13:15:02

标签: mysql sql performance advanced-search

好的,我认为这个问题的答案在某个地方,但我无法找到它...... (甚至我的头衔还不错)

简而言之,我想从关联表的一部分得到最少的组

1st,请记住这已经是5个表(+ 1k行)加入过滤器和分组的结果,我必须在prod服务器上运行很多次,就像a香蕉...

第二,这是一个伪造的案例,描绘了我的问题

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

+--------------------+
|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个人制作课程。

第二次查询

既然我已经上过这些课程,我想按照这个时间表去另外两门课程3250

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

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

我想逐课检查课程,所以"检查课程32",不需要同时检查多个

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

对于课程32,教师2不会这样做,但正如教师1所做的那样Courses(6, 33, 34, 32)我不需要另外一位老师。

对于课程50,唯一的老师就是老师12,所以我在选择老师时找不到匹配项,而且我还要再找一个(总共有两个这些数据)

这是一个基础SQLFiddle sqlfiddle http://sqlfiddle.com/images/fiddle_transparent_small.png

最好的问候,布拉格

2 个答案:

答案 0 :(得分: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?

答案 1 :(得分:1)

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

对于第一个查询,由于我的基本真正需求是“是否有一位老师可以做所有事情”,我已经降低了一点我的期望并选择了这一点(我的真实案例u_u为58行):< / p>

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

SQLFiddle sqlfiddle http://sqlfiddle.com/images/fiddle_transparent_small.png

我回复了两个回答我的问题的价值“是一个老师吗?”

+--------------------------------------+
|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
        ));

SQLFiddle sqlfiddle http://sqlfiddle.com/images/fiddle_transparent_small.png

这告诉我能够教授我已经拥有的课程和我想要的新课程的老师数量。所以如果它超过零,那么我就不需要新老师了:

+--+
|nb|
+--+
|1 |
+--+