SQL 查询 return 子类别中的所有课程
SQL query to return all courses inside a subcategory
大家好吗?我正在尝试获取 sql 查询,其中 return 包含一些数据。
看情况:
我有一组类别,类别统一性和组织性,这是我的主要类别,在这些类别中我有更多的子类别,例如数学、舞蹈等在这些子类别中我还有一些,例如扩展、毕业、其他等。在这些类别中,我有一些我在这里称为叶子课程的课程,例如应用数学,and/or 我还有另一个子类别,例如math2016.2、math2017.1等,里面可以有课程and/or另一个子类。所以你可以看到我的主要类别中可能有更多的子类别。
接下来发生的是,我有 2 个查询,在第一个查询中我只能 return 我的叶课程,换句话说,我可以 return 直接关联到我的课程subcategory Extension(也就是我想要的类别return里面的所有课程),但是我不能returnExtesion里面的子类别里面的课程,换句话说,我不能return math2016.2 和 math2017.1 中的课程。
在我的第二个查询中,我可以 return 子类别中的所有课程 math/extension/* 但问题是,我必须在查询中只传递一个子类别 ID,换句话说,我必须在一个查询中传递子类别数学的 id,在另一个查询中我必须传递子类别舞蹈的 id,因为我有很多子类别,这样做并不简单。
所以我想我的这些查询可以转换为只有一个,并且只有一个查询我 return 所有扩展子类别中的所有课程,我该怎么做?
查询如下:
1) Return 子类别扩展的叶课程
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) Returns 属于特定子类别的所有课程
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
在 table mdl_course_categories 我有列路径,该列有子类别的路径,例如unity是id 2,所以路径是/2,math是id 4,那么路径是/2/4(表示math在unity里面),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,也就是说,math里面的extension可以有id 5但是dance里面的extension有另一个完全不同的id,而且没有模式。
你可能想要这样的东西:
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 OR ct.path LIKE CONCAT(basecat.path, '/%')"(直接按 ID 进行比较,然后将路径与添加的尾随“/”进行比较)。
- 同时获取每门课程的名称和每个类别中的课程数量是无效的(您需要将查询拆分为子查询才能执行此操作)- 您要么分组类别并获取课程数量,或者您不是分组而是获取所有课程。
如果您想在 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 方法。一些选项是递归的(returns 来自子类别的课程),排序等
希望对您有所帮助
大家好吗?我正在尝试获取 sql 查询,其中 return 包含一些数据。 看情况:
我有一组类别,类别统一性和组织性,这是我的主要类别,在这些类别中我有更多的子类别,例如数学、舞蹈等在这些子类别中我还有一些,例如扩展、毕业、其他等。在这些类别中,我有一些我在这里称为叶子课程的课程,例如应用数学,and/or 我还有另一个子类别,例如math2016.2、math2017.1等,里面可以有课程and/or另一个子类。所以你可以看到我的主要类别中可能有更多的子类别。
接下来发生的是,我有 2 个查询,在第一个查询中我只能 return 我的叶课程,换句话说,我可以 return 直接关联到我的课程subcategory Extension(也就是我想要的类别return里面的所有课程),但是我不能returnExtesion里面的子类别里面的课程,换句话说,我不能return math2016.2 和 math2017.1 中的课程。
在我的第二个查询中,我可以 return 子类别中的所有课程 math/extension/* 但问题是,我必须在查询中只传递一个子类别 ID,换句话说,我必须在一个查询中传递子类别数学的 id,在另一个查询中我必须传递子类别舞蹈的 id,因为我有很多子类别,这样做并不简单。
所以我想我的这些查询可以转换为只有一个,并且只有一个查询我 return 所有扩展子类别中的所有课程,我该怎么做?
查询如下:
1) Return 子类别扩展的叶课程
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) Returns 属于特定子类别的所有课程
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
在 table mdl_course_categories 我有列路径,该列有子类别的路径,例如unity是id 2,所以路径是/2,math是id 4,那么路径是/2/4(表示math在unity里面),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,也就是说,math里面的extension可以有id 5但是dance里面的extension有另一个完全不同的id,而且没有模式。
你可能想要这样的东西:
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 OR ct.path LIKE CONCAT(basecat.path, '/%')"(直接按 ID 进行比较,然后将路径与添加的尾随“/”进行比较)。
- 同时获取每门课程的名称和每个类别中的课程数量是无效的(您需要将查询拆分为子查询才能执行此操作)- 您要么分组类别并获取课程数量,或者您不是分组而是获取所有课程。
如果您想在 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 方法。一些选项是递归的(returns 来自子类别的课程),排序等
希望对您有所帮助