2017-03-02 54 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