aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan-Hendrik Willms <tleilax+studip@gmail.com>2024-08-23 13:07:39 +0000
committerJan-Hendrik Willms <tleilax+studip@gmail.com>2024-08-23 13:07:39 +0000
commitf42f687872f4887f557e8dec9226c8a2f318597c (patch)
tree9f490c76096543d8b735cfc3e5106b108c79f34c
parent5029f8e0119657c954fb06bf3adca4cf21a09ada (diff)
use correct join type to avoid reading way too many courses, fixes #4518
Closes #4518 Merge request studip/studip!3319
-rw-r--r--lib/extern/ExternPagePersonDetails.php45
1 files changed, 20 insertions, 25 deletions
diff --git a/lib/extern/ExternPagePersonDetails.php b/lib/extern/ExternPagePersonDetails.php
index a62d482..2624c08 100644
--- a/lib/extern/ExternPagePersonDetails.php
+++ b/lib/extern/ExternPagePersonDetails.php
@@ -135,29 +135,24 @@ class ExternPagePersonDetails extends ExternPage
{
$grouped_courses = [];
$semesters = $this->getSemesters();
- $query = "
- SELECT
- IFNULL(`semester_courses`.`semester_id`, '-1') AS `group_id`,
- `seminare`.*
- FROM
- `seminare`
- LEFT JOIN `semester_courses`
+ $query = "SELECT IFNULL(`semester_courses`.`semester_id`, '-1') AS `group_id`,
+ `seminare`.*
+ FROM `seminare`
+ LEFT JOIN `semester_courses`
ON `semester_courses`.`course_id` = `seminare`.`Seminar_id`
- LEFT JOIN `seminar_user` USING(`seminar_id`)
- LEFT JOIN `sem_types`
- ON `sem_types`.`id` = `seminare`.`status`
- WHERE `seminare`.`visible` = 1
- AND `semester_courses`.`semester_id` IN (:semester_ids) OR ISNULL(`semester_id`)
- AND `seminar_user`.`user_id` = :user_id
- AND `seminar_user`.`status` = 'dozent'
- AND `sem_types`.`class` IN (:semclasses)";
-
- $grouped_results = DBManager::get()->fetchGrouped($query,
- [
- 'semester_ids' => $semesters,
- 'semclasses' => (array) $this->semclass,
- 'user_id' => $user->id
- ]);
+ JOIN `seminar_user` USING(`seminar_id`)
+ JOIN `sem_types` ON `sem_types`.`id` = `seminare`.`status`
+ WHERE `seminare`.`visible` = 1
+ AND (`semester_courses`.`semester_id` IN (:semester_ids) OR ISNULL(`semester_id`))
+ AND `seminar_user`.`user_id` = :user_id
+ AND `seminar_user`.`status` = 'dozent'
+ AND `sem_types`.`class` IN (:semclasses)";
+
+ $grouped_results = DBManager::get()->fetchGrouped($query, [
+ 'semester_ids' => $semesters,
+ 'semclasses' => (array) $this->semclass,
+ 'user_id' => $user->id
+ ]);
// handle unlimited courses
if (isset($grouped_results['-1'])) {
@@ -171,9 +166,9 @@ class ExternPagePersonDetails extends ExternPage
unset($grouped_results['-1']);
}
foreach ($grouped_results as $group_id => $group_result) {
- $grouped_courses[$group_id] =
- SimpleORMapCollection::createFromArray(
- Course::findMany($group_result));
+ $grouped_courses[$group_id] = SimpleORMapCollection::createFromArray(
+ Course::findMany($group_result)
+ );
}
return $grouped_courses;
}