MDL-48090 mod_forum: Optimise subquery out of discussion subs list
authorAndrew Nicols <andrew@nicols.co.uk>
Thu, 6 Nov 2014 09:40:25 +0000 (17:40 +0800)
committerDan Poltawski <dan@moodle.com>
Thu, 6 Nov 2014 13:39:44 +0000 (13:39 +0000)
mod/forum/classes/subscriptions.php

index f431f2d..d0672f3 100644 (file)
@@ -425,23 +425,24 @@ class subscriptions {
             $params['forumid'] = $forum->id;
 
             if ($includediscussionsubscriptions) {
-                $params['dforumid'] = $forum->id;
+                $params['sforumid'] = $forum->id;
+                $params['dsforumid'] = $forum->id;
                 $params['unsubscribed'] = self::FORUM_DISCUSSION_UNSUBSCRIBED;
 
                 $sql = "SELECT $fields
-                        FROM {user} u
-                        WHERE u.id IN (
-                            SELECT u2.id FROM
-                            {user} u2
-                            JOIN ($esql) je ON je.id = u2.id
-                            LEFT JOIN {forum_subscriptions} s ON s.userid = u2.id
-                            LEFT JOIN {forum_discussion_subs} ds ON ds.userid = u2.id
+                        FROM (
+                            SELECT userid FROM {forum_subscriptions} s
+                            WHERE
+                                s.forum = :sforumid
+                                UNION
+                            SELECT userid FROM {forum_discussion_subs} ds
                             WHERE
-                              s.forum = :forumid
-                            OR
-                              (ds.forum = :dforumid AND ds.preference <> :unsubscribed)
-                        )
+                                ds.forum = :dsforumid AND ds.preference <> :unsubscribed
+                        ) subscriptions
+                        JOIN {user} u ON u.id = subscriptions.userid
+                        JOIN ($esql) je ON je.id = u.id
                         ORDER BY u.email ASC";
+
             } else {
                 $sql = "SELECT $fields
                         FROM {user} u