SQL查询返回子类别

时间:2017-03-02 13:14:56

标签: mysql sql moodle

什么样的家伙?我正在尝试获取一个返回一些数据的SQL查询。 看情况:

我有一组类别,类别统一和组织,这是我的主要类别,在这些类别中我有更多子类别,例如这些子类别中的数学,舞蹈等我还有更多,例如扩展,毕业,其他等。在这些类别中,我有一些课程,我在这里称为叶子课程,例如应用数学,和/或我有另一个子类别,例如math2016.2,math2017.1等,里面可以有课程和/或其他子类别。所以你可以看到我的主要类别中可能有更多的子类别。

接下来会发生什么,我得到了2个查询,在我的第一个查询中,我只能返回我的叶子课程,换句话说,我可以返回与我的子类别扩展名直接相关的课程(这是我要返回的类别)所有课程都在里面),但是我不能在Extesion的子类别中返回课程,换句话说,我不能在math2016.2和math2017.1中返回课程。

在我的第二个查询中,我可以返回子类别math / extension / *中的所有课程,但问题是,我必须在查询中只传递一个子类别ID,换句话说,我必须传递子类别的id数学在一个查询和另一个查询中我必须传递子类别舞蹈的id,因为我有许多子类别不是这样做的。

所以我猜我的这些查询可以转换为只有一个,在一个查询中我返回所有Extension子类别中的所有课程,我该怎么做?

查询如下:

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,math是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完全不同,并且没有模式。

2 个答案:

答案 0 :(得分: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进行比较,然后将路径与后续添加的&/ 39进行比较)。
  • 无法同时获取每门课程的名称和每个类别的课程数量(您需要将查询拆分为子查询才能执行此操作) - 您要么按类别分组并计算课程数量,或者您没有分组但是获得所有课程。

答案 1 :(得分: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方法。一些选项是递归的(从子类别返回课程),排序等。

希望这有帮助