首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >最少按不同的- SQL分组。

最少按不同的- SQL分组。
EN

Stack Overflow用户
提问于 2015-11-16 13:15:01
回答 2查看 107关注 0票数 1

好吧,我想答案在某个地方,但我找不到.(连我的头衔都不好)

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

第一,请记住,这已经是一个5表(+1k行)与过滤器和分组连接的结果,我将不得不在一个像香蕉一样强大的prod服务器上运行很多次.

第二,这是一个假象,你知道我的问题。

经过一些查询后,我得到了以下数据:

代码语言:javascript
复制
+--------------------+
|id_course|id_teacher|
+--------------------+
|    6    |    1     |
|    6    |    4     |
|    6    |    14    |
|   33    |    1     |
|   33    |    4     |
|   34    |    1     |
|   34    |    4     |
|   34    |    10    |
+--------------------+

如你所见,我有三门课,巫婆最多由三位老师教。我需要参加每门课程中的一门,但我想要尽可能少的不同的老师(我很害羞……)。

我的第一个问题

答:,我所需要的最小的教师人数是多少?

有了这些数据,这是一个1,因为老师1或老师4为这3一个做课程。

第二次查询

既然我已经得到了这些课程,我想学习另外两门课程,3250,还有这个时间表:

代码语言:javascript
复制
+--------------------+
|id_course|id_teacher|
+--------------------+
|   32    |    1     |
|   32    |    12    |
|   50    |    12    |
+--------------------+

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

我想按课程来检查课程,所以“检查32门课程”,不需要同时检查很多课程。

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

对于32课程,Teacher2不做这门课,但是作为Teacher1 do Courses(6, 33, 34, 32),我不需要找其他的老师。

对于50课程,唯一做这件事的老师是Teacher12,所以我在选择老师时找不到合适的人选,我还得再找一位(总共有两位)。

这是一个基地[SQLFiddle ]

向你问好,巴格

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-18 16:50:28

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

对于第一个问题,由于我的实际需要是“是否有一位教师来做任何事情”,我已经降低了我的期望,开始了这个期望(在我的真实案例u_u上有58行代码):

代码语言:javascript
复制
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

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

代码语言:javascript
复制
+--------------------------------------+
|nbMaxBySingleTeacher|nbTotalCourseToDo|
+--------------------------------------+
|         4          |        5        |
+--------------------------------------+

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

代码语言:javascript
复制
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

这告诉我有多少位老师能够教我已经拥有的课程,以及我想要的新课程。所以如果超过零,我就不需要新老师了:

代码语言:javascript
复制
+--+
|nb|
+--+
|1 |
+--+
票数 1
EN

Stack Overflow用户

发布于 2015-11-16 15:15:06

你想要一个ID_Teachers的计数和最少的计数那么..。得到一个明确的计数,并将结果限制为1条记录。

所以也许就像..。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33736317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档