2017-03-02 57 views
0

這是怎麼回事?我試圖得到一個SQL查詢返回一些數據。 查看具體情況:SQL查詢返回子類別內的所有課程

我有一套類別,類別統一和組織,這些是我的主要類別,在這些類別中我有更多的子類別。數學,舞蹈等,在這些子類別中我還有一些,例如擴展,畢業,其他等。在這些類別中,我有一些課程,我在這裏稱之爲葉課程。應用數學,和/或我有另一個子類,例如math2016.2,math2017.1等,裏面可以有課程和/或其他子類別。所以你可以看到我的主要類別中可能有更多的子類別。

接下來會發生什麼,我得到2個查詢,在我的第一個中,我只能返回我的葉子課程,換句話說,我可以返回直接與我的子類別相關的課程擴展(這是我想要的類別返回裏面的所有課程),但是我不能在Extesion內的子類別中返回課程,換句話說,我無法返回math2016.2和math2017.1中的課程。

在我的第二個查詢中,我可以返回子類別數學/擴展/ *中的所有課程,但問題是,我必須在查詢中只傳入一個子類別ID,換句話說,我必須傳遞在一個查詢中的子類別數學和另一個查詢我必須通過子類別的舞蹈的id,因爲我有很多子類別不是trival做到這一點。

所以我想這些查詢我可以被轉換爲只有一個,並在只有一個查詢我返回所有擴展子類別內的所有課程,我該怎麼做?

的查詢如下波紋管:

1)一個子類別擴展

SELECT ct.id, c.fullname, ct.name, ct.path, COUNT(ct.id) AS coursecount 
FROM mdl_course_categories ct 
INNER JOIN mdl_course c ON c.category=ct.id 
WHERE ct.name like "Extension%" 
GROUP BY ct.id, ct.name, c.fullname, ct.path 
ORDER BY COUNT(ct.id) DESC 

2)的返回葉課程返回是一個特定子類別

SELECT ct.id, c.fullname, ct.name, ct.path, COUNT(ct.id) AS coursecount 
FROM mdl_course_categories ct 
INNER JOIN mdl_course c ON c.category=ct.id 
WHERE ct.path like "/2/36/76%" 
GROUP BY ct.id, ct.name, c.fullname, ct.path 
ORDER BY COUNT(ct.id) DESC 

在內部的所有課程表mdl_course_categories我有列路徑,這個列有子類別的路徑,例如Unity是id 2,所以路徑是/ 2,數學是id 4,然後路徑是/ 2/4(這意味着數學是在統一內),math2017.1是id 6,所以路徑是/ 2/4/5/6

+----+------------+----------+ 
| id | course | path | 
+----+------------+----------+ 
| 2 |  unity |  /2 | 
| 4 |  math |  /2/4 | 
| 5 | extension | /2/4/5 | 
| 6 | math2017.1 | /2/4/5/6 | 
+----+------------+----------+ 

我也不得不說,子類擴展有不同的ID給每個類別了他,那就是,擴展中的數學可以有ID爲5,但延長的舞蹈裏面有另一個ID完全不同,沒有模式。

回答

1

你可能想是這樣的:

SELECT ct.id, c.fullname, ct.name, ct.path 
FROM mdl_course_categories ct 
JOIN mdl_course_categories basecat ON basecat.id = ct.id OR ct.path LIKE CONCAT(basecat.path, '/%') 
JOIN mdl_course c ON c.category = ct.id 
WHERE ct.name LIKE 'Extension%' 

注:

  • 這是MySQL只 - 如果你從Moodle中自己這樣做,你可以替換爲「CONCAT」部分$ DB-> sql_concat()用於交叉數據庫兼容性(如果可能的話,您還想使用$ DB-> sql_like())。
  • 從你的問題中,「ct.path LIKE'/ 2/36/76%'」可能會出錯,因爲這也會匹配'/ 2/36/761'的子類別 - 這就是爲什麼我的查詢有「basecat .id = ct.id或ct.path LIKE CONCAT(basecat.path,'/%')「(直接通過ID比較,然後將路徑與添加的尾部'/'進行比較)。
  • 無法同時獲得每個課程的名稱和每個類別的課程數量(您需要將查詢拆分爲子查詢來完成此操作) - 無論是按類別分組並得到一些課程,或者你不分組,但獲得所有課程。
+0

不,它不工作,只是重複3次的結果。我正在考慮遞歸地獲取它,但我仍然不知道如何去做。 – crbroflovski

0

如果你正試圖獲得在Moodle的插件,您可以試試這個課程:

$categories = coursecat::get(0); 
foreach($categories as $category) { 
    $courses_in_category = $category->get_courses();//You can pass an array of options also to the method. 
    //Process the course array 
} 

你也可以傳遞的選項給get_courses方法的陣列。有些選項是遞歸(返回從子類別以及課程),排序等

希望這有助於

+0

是的人,我解決了,我試過這樣的事情,不完全是你評論的這個功能,但我現在使用PHP,並獲得了所有路徑的數組,所以我使用我的第一個查詢傳遞數組並返回我想要的。謝謝你幫助我! – crbroflovski