2015-11-16 56 views
1

好吧,我覺得這個答案是什麼地方,但我不能找到它... (甚至我的標題是壞的)最少的由不同分組 - SQL

短,我想數量最少的組我可以從關聯表


1的一部分做,請記住,這已經是一個5臺的結果(+ 1K線),過濾和分組加盟,我必須在prod服務器上運行許多時間,像香蕉一樣強大......

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個課程製作課程。


第二個查詢

現在,我已經獲得這些課程,我想去另外兩個療程後,3250,這個時間表:

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

我問題是:對於id_course N,我需要多一個老師嗎?

我要檢查的過程中當然,如此「檢查過程32」,不需要檢查許多在同一時間

我認爲最好的方法是計算一個列表內連接第一個查詢的等級最低的老師,所以我們的數據只有兩個:Teacher(1, 4)

對於課程32,Teacher2不這樣做,但是因爲Teacher1做Courses(6, 33, 34, 32)我不必再找另一個老師。

對於課程50,唯一的老師是老師12,所以我不會在我選擇的老師中找到一個匹配,而且我將不得不再獲得一個(所以這兩個數據總共有兩個) )


這裏是一個基礎SQLFiddle sqlfiddle http://sqlfiddle.com/images/fiddle_transparent_small.png

最好的問候,Blag

回答

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 

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 | 
+--+ 
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可以完成所有必需的課程......這兩個記錄是否應該返回結果或者是否足夠?

+0

[this](http://sqlfiddle.com/#!9/9090a/6)return me'4' and not the '我想要;我需要爲每門課程聘請一位老師,並且試着找出是否有一位老師教授我需要的每門課程 – Blag

+0

這就像解決**「我需要覆蓋每門獨特課程的最少數量的老師是什麼?」* * – Blag

+0

有趣我現在得到它......仍在考慮。 – xQbert