好吧,我想答案在某个地方,但我找不到.(连我的头衔都不好)
简而言之,我想从关联表的一部分中得到最小数量的组。
第一,请记住,这已经是一个5表(+1k行)与过滤器和分组连接的结果,我将不得不在一个像香蕉一样强大的prod服务器上运行很多次.
第二,这是一个假象,你知道我的问题。
经过一些查询后,我得到了以下数据:
+--------------------+
|id_course|id_teacher|
+--------------------+
| 6 | 1 |
| 6 | 4 |
| 6 | 14 |
| 33 | 1 |
| 33 | 4 |
| 34 | 1 |
| 34 | 4 |
| 34 | 10 |
+--------------------+如你所见,我有三门课,巫婆最多由三位老师教。我需要参加每门课程中的一门,但我想要尽可能少的不同的老师(我很害羞……)。
我的第一个问题
答:,我所需要的最小的教师人数是多少?
有了这些数据,这是一个1,因为老师1或老师4为这3一个做课程。
第二次查询
既然我已经得到了这些课程,我想学习另外两门课程,32和50,还有这个时间表:
+--------------------+
|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 ]

向你问好,巴格
发布于 2015-11-18 16:50:28
所以我终于找到了做我想做的事的方法!
对于第一个问题,由于我的实际需要是“是否有一位教师来做任何事情”,我已经降低了我的期望,开始了这个期望(在我的真实案例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[SQLFiddle

我得到了两个回答我问题的价值:“一个老师够了吗?”
+--------------------------------------+
|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

这告诉我有多少位老师能够教我已经拥有的课程,以及我想要的新课程。所以如果超过零,我就不需要新老师了:
+--+
|nb|
+--+
|1 |
+--+发布于 2015-11-16 15:15:06
你想要一个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足够?
https://stackoverflow.com/questions/33736317
复制相似问题