按不同分组最少 - SQL
Fewest grouped by distinct - SQL
好的,我想这个问题的答案在某处,但我找不到...
(连我的标题都不好)
简而言之,我想从协会的一部分中获得我可以制作的最少数量的组 table
1st,请记住,这已经是 5 table(+1k 行)加入过滤器和分组的结果,我必须 运行很多次在像香蕉一样强大的生产服务器上...
2、这是一个假的案例,把你的问题描绘成我的问题
经过一些查询,我得到了这个数据结果:
+--------------------+
|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 个人开设了课程。
第二次查询
现在我已经学习了这些课程,我想参加另外两门课程,32
和 50
,时间表如下:
+--------------------+
|id_course|id_teacher|
+--------------------+
| 32 | 1 |
| 32 | 12 |
| 50 | 12 |
+--------------------+
我的问题是:对于id_course N,我需要再找一位老师吗?
我想逐门查,所以"check for course 32",不需要同时查很多
我认为最好的方法是从第一个查询中计算一个内部连接和一个最低等级的教师列表,所以我们的数据只有两个:Teacher(1, 4)
.
对于课程 32
,Teacher2 不做这门课,但正如 Teacher1 做的那样Courses(6, 33, 34, 32)
我不必再找其他老师了。
对于课程50
,唯一的老师是Teacher12,所以我不会在我选择的老师中找到匹配的,我必须再找一个(所以两个加上这些数据)
此致,布拉格
您想用最少的计数获得 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
但是,如果存在平局,这将随机 select...那么您是否要为 select 哪组教师和 类 应该存在平局提供选项?这意味着有多个路径可以满足所有 类 涉及相同数量的教师...例如教师 A、B 和 A、C 满足所有要求 类... 应该都记录 return 在结果中还是 1 就足够了?
所以我终于找到了一种方法来做我想做的事!
对于第一个查询,因为我的潜在实际需求是 "is there a single teacher to do everything",所以我降低了一点期望并选择了这个(我的真实案例有 58 行 u_u"):
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
然后我得到两个值来回答我的问题 "is one teacher enough ?"
+--------------------------------------+
|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
));
这告诉我有多少老师能够教授我已经拥有的课程和我想要的新课程。所以如果它超过零,那么我就不需要新老师了:
+--+
|nb|
+--+
|1 |
+--+
好的,我想这个问题的答案在某处,但我找不到... (连我的标题都不好)
简而言之,我想从协会的一部分中获得我可以制作的最少数量的组 table
1st,请记住,这已经是 5 table(+1k 行)加入过滤器和分组的结果,我必须 运行很多次在像香蕉一样强大的生产服务器上...
2、这是一个假的案例,把你的问题描绘成我的问题
经过一些查询,我得到了这个数据结果:
+--------------------+
|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 个人开设了课程。
第二次查询
现在我已经学习了这些课程,我想参加另外两门课程,32
和 50
,时间表如下:
+--------------------+
|id_course|id_teacher|
+--------------------+
| 32 | 1 |
| 32 | 12 |
| 50 | 12 |
+--------------------+
我的问题是:对于id_course N,我需要再找一位老师吗?
我想逐门查,所以"check for course 32",不需要同时查很多
我认为最好的方法是从第一个查询中计算一个内部连接和一个最低等级的教师列表,所以我们的数据只有两个:Teacher(1, 4)
.
对于课程 32
,Teacher2 不做这门课,但正如 Teacher1 做的那样Courses(6, 33, 34, 32)
我不必再找其他老师了。
对于课程50
,唯一的老师是Teacher12,所以我不会在我选择的老师中找到匹配的,我必须再找一个(所以两个加上这些数据)
此致,布拉格
您想用最少的计数获得 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
但是,如果存在平局,这将随机 select...那么您是否要为 select 哪组教师和 类 应该存在平局提供选项?这意味着有多个路径可以满足所有 类 涉及相同数量的教师...例如教师 A、B 和 A、C 满足所有要求 类... 应该都记录 return 在结果中还是 1 就足够了?
所以我终于找到了一种方法来做我想做的事!
对于第一个查询,因为我的潜在实际需求是 "is there a single teacher to do everything",所以我降低了一点期望并选择了这个(我的真实案例有 58 行 u_u"):
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
然后我得到两个值来回答我的问题 "is one teacher enough ?"
+--------------------------------------+
|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
));
这告诉我有多少老师能够教授我已经拥有的课程和我想要的新课程。所以如果它超过零,那么我就不需要新老师了:
+--+
|nb|
+--+
|1 |
+--+