diff options
author | David M <davidmj@users.sourceforge.net> | 2006-05-13 00:57:13 +0000 |
---|---|---|
committer | David M <davidmj@users.sourceforge.net> | 2006-05-13 00:57:13 +0000 |
commit | d5fc1c29f2ce7d7a310f63eaf877e0bfa42ef57c (patch) | |
tree | b289bf4ec9c8c455e1c07368114f66e29595e162 /phpBB | |
parent | 8b88ffe996904f017d483d9da6ffd066e6f7cee1 (diff) | |
download | forums-d5fc1c29f2ce7d7a310f63eaf877e0bfa42ef57c.tar forums-d5fc1c29f2ce7d7a310f63eaf877e0bfa42ef57c.tar.gz forums-d5fc1c29f2ce7d7a310f63eaf877e0bfa42ef57c.tar.bz2 forums-d5fc1c29f2ce7d7a310f63eaf877e0bfa42ef57c.tar.xz forums-d5fc1c29f2ce7d7a310f63eaf877e0bfa42ef57c.zip |
- Split the viewtopic query into two pieces. We gain speed by avoiding the need to GROUP BY/ORDER BY the selected elements. We also gain cross-DB compliance. Yay!
git-svn-id: file:///svn/phpbb/trunk@5906 89ea8834-ac86-4346-8a33-228a782c2dd0
Diffstat (limited to 'phpBB')
-rw-r--r-- | phpBB/viewtopic.php | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/phpBB/viewtopic.php b/phpBB/viewtopic.php index bf9d7e15f4..98f5603a6e 100644 --- a/phpBB/viewtopic.php +++ b/phpBB/viewtopic.php @@ -156,23 +156,20 @@ if ($view && !$post_id) // This rather complex gaggle of code handles querying for topics but // also allows for direct linking to a post (and the calculation of which // page the post is on and the correct display of viewtopic) -$group = ''; -$select_sql = 't.topic_id, t.forum_id, t.topic_title, t.topic_attachment, t.topic_status, t.topic_approved, t.topic_replies_real, t.topic_replies, t.topic_first_post_id, t.topic_last_post_id, t.topic_last_poster_id, t.topic_last_post_time, t.topic_poster, t.topic_time, t.topic_time_limit, t.topic_type, t.topic_bumped, t.topic_bumper, t.poll_max_options, t.poll_start, t.poll_length, t.poll_title, t.poll_vote_change, f.forum_name, f.forum_desc, f.forum_desc_uid, f.forum_desc_bitfield, f.forum_parents, f.parent_id, f.left_id, f.right_id, f.forum_status, f.forum_type, f.forum_id, f.forum_style, f.forum_password, f.forum_rules, f.forum_rules_link, f.forum_rules_uid, f.forum_rules_bitfield'; - $sql_array = array( - 'SELECT' => $select_sql, + 'SELECT' => 't.topic_id, t.forum_id, t.topic_title, t.topic_attachment, t.topic_status, t.topic_approved, t.topic_replies_real, t.topic_replies, t.topic_first_post_id, t.topic_last_post_id, t.topic_last_poster_id, t.topic_last_post_time, t.topic_poster, t.topic_time, t.topic_time_limit, t.topic_type, t.topic_bumped, t.topic_bumper, t.poll_max_options, t.poll_start, t.poll_length, t.poll_title, t.poll_vote_change, f.forum_name, f.forum_desc, f.forum_desc_uid, f.forum_desc_bitfield, f.forum_parents, f.parent_id, f.left_id, f.right_id, f.forum_status, f.forum_type, f.forum_id, f.forum_style, f.forum_password, f.forum_rules, f.forum_rules_link, f.forum_rules_uid, f.forum_rules_bitfield', 'FROM' => array( FORUMS_TABLE => 'f', ) ); -$left_join = array(); - if ($user->data['is_registered']) { + // We pop on left joins into the array for later insertion + $left_join = array(); + $sql_array['SELECT'] .= ', tw.notify_status'; - $group .= ', tw.notify_status'; $left_join[] = array( 'FROM' => array(TOPICS_WATCH_TABLE => 'tw'), 'ON' => 'tw.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tw.topic_id' @@ -181,7 +178,6 @@ if ($user->data['is_registered']) if ($config['allow_bookmarks']) { $sql_array['SELECT'] .= ', bm.order_id as bookmarked'; - $group .= ', bm.order_id'; $left_join[] = array( 'FROM' => array(BOOKMARKS_TABLE => 'bm'), 'ON' => 'bm.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = bm.topic_id' @@ -191,7 +187,6 @@ if ($user->data['is_registered']) if ($config['load_db_lastread']) { $sql_array['SELECT'] .= ', tt.mark_time, ft.mark_time as forum_mark_time'; - $group .= ', tt.mark_time, ft.mark_time'; $left_join[] = array( 'FROM' => array(TOPICS_TRACK_TABLE => 'tt'), 'ON' => 'tt.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tt.topic_id' @@ -201,6 +196,9 @@ if ($user->data['is_registered']) 'ON' => 'ft.user_id = ' . $user->data['user_id'] . ' AND t.forum_id = ft.forum_id' ); } + + // Insert the joins into the query array + $sql_array['LEFT_JOIN'] = $left_join; } if (!$post_id) @@ -210,18 +208,9 @@ if (!$post_id) else { $sql_array['WHERE'] = "p.post_id = $post_id AND t.topic_id = p.topic_id" . ((!$auth->acl_get('m_approve', $forum_id)) ? ' AND p.post_approved = 1' : ''); - $sql_array['SELECT'] .= ', COUNT(p2.post_id) AS prev_posts'; - $sql_array['GROUP_BY'] = 'p.post_id, ' . $select_sql . $group; - $sql_array['ORDER_BY'] = 'p.post_id ' . (($sort_dir == 'd') ? 'DESC' : 'ASC'); $sql_array['FROM'][POSTS_TABLE] = 'p'; - - $left_join[] = array( - 'FROM' => array(POSTS_TABLE => 'p2'), - 'ON' => 'p2.topic_id = t.topic_id AND p2.post_approved = 1 ' . (($sort_dir == 'd') ? "AND p2.post_id >= $post_id" : "AND p2.post_id <= $post_id") - ); } -$sql_array['LEFT_JOIN'] = $left_join; $sql_array['WHERE'] .= ' AND (f.forum_id = t.forum_id ' . ((!$forum_id) ? 'OR t.topic_type = ' . POST_GLOBAL : 'OR (t.topic_type = ' . POST_GLOBAL . " AND f.forum_id = $forum_id)") . ')'; $sql_array['FROM'][TOPICS_TABLE] = 't'; @@ -247,6 +236,21 @@ if (!($topic_data = $db->sql_fetchrow($result))) trigger_error('NO_TOPIC'); } +// This is for determining where we are (page) +if ($post_id) +{ + $sql = "SELECT count(*) AS prev_posts + FROM " . POSTS_TABLE . " p + WHERE p.post_approved = 1 + AND p.topic_id = {$topic_data['topic_id']} + " . ((!$auth->acl_get('m_approve', $forum_id)) ? 'AND p.post_approved = 1' : '') . " + AND " . (($sort_dir == 'd') ? "p.post_id >= $post_id" : "p.post_id <= $post_id"); + $result = $db->sql_query($sql); + $row = $db->sql_fetchrow($result); + $db->sql_freeresult($result); + $topic_data['prev_posts'] = $row['prev_posts']; +} + $old_forum_id = $forum_id; $forum_id = (int) $topic_data['forum_id']; $topic_id = (int) $topic_data['topic_id']; |