SQL查询请与PHP协作合并

时间:2010-12-05 05:47:38

标签: php sql mysql

嘿伙计们我想通过poster_time而不是通常的id递增对消息进行排序,因为我已经恢复了具有自动递增id的数据库,并且非常旧的消息显示在顶部我希望能够通过poster_time对它们进行排序解决了这个问题。

我自己试图解决这个问题,但我不想失去任何功能,这是我的尝试。

SELECT t.id_topic
            FROM {db_prefix}topics AS t' . ($context['sort_by'] === 'last_poster' ? '
                INNER JOIN {db_prefix}messages AS ml ON (ml.id_msg = t.id_last_msg)' : (in_array($context['sort_by'], array('starter', 'subject')) ? '
                INNER JOIN {db_prefix}messages AS mf ON (mf.id_msg = t.id_first_msg)' : '')) . ($context['sort_by'] === 'starter' ? '
                LEFT JOIN {db_prefix}members AS memf ON (memf.id_member = mf.id_member)' : '') . ($context['sort_by'] === 'last_poster' ? '
                LEFT JOIN {db_prefix}members AS meml ON (meml.id_member = ml.id_member)' : '') . '
            WHERE t.id_board = {int:current_board}' . (!$modSettings['postmod_active'] || $context['can_approve_posts'] ? '' : '
                AND (t.approved = {int:is_approved}' . ($user_info['is_guest'] ? '' : ' OR t.id_member_started = {int:current_member}') . ')') . '
            ORDER BY ' . (!empty($modSettings['enableStickyTopics']) ? 'is_sticky' . ($fake_ascending ? '' : ' DESC') . ', ' : '') . $_REQUEST['sort'] . ($ascending ? '' : ' DESC') . '
            LIMIT {int:start}, {int:maxindex}',

用于测试目的

SELECT t.id_topic
            FROM topics AS t
                INNER JOIN messages AS ml ON (ml.id_msg = t.id_last_msg)
                INNER JOIN messages AS mf ON (mf.id_msg = t.id_first_msg)
                LEFT JOIN members AS memf ON (memf.id_member = mf.id_member)
                LEFT JOIN members AS meml ON (meml.id_member = ml.id_member)
            WHERE t.id_board = 1
      ORDER BY ml.poster_time DESC
            LIMIT 0, 500

使用上面的代码我发现我需要ml.poster_time DESC如何将其与最顶层的代码捆绑在一起。

这里是结构

董事会结构 alt text alt text alt text

   $topic_ids = array();
   $context['topics'] = array();

   // Sequential pages are often not optimized, so we add an additional query.
   $pre_query = $start > 0;
   if ($pre_query && $maxindex > 0)
   {
      $request = $smcFunc['db_query']('', '
         SELECT t.id_topic
         FROM {db_prefix}topics AS t' . ($context['sort_by'] === 'last_poster' ? '
            INNER JOIN {db_prefix}messages AS ml ON (ml.id_msg = t.id_last_msg)' : (in_array($context['sort_by'], array('starter', 'subject')) ? '
            INNER JOIN {db_prefix}messages AS mf ON (mf.id_msg = t.id_first_msg)' : '')) . ($context['sort_by'] === 'starter' ? '
            LEFT JOIN {db_prefix}members AS memf ON (memf.id_member = mf.id_member)' : '') . ($context['sort_by'] === 'last_poster' ? '
            LEFT JOIN {db_prefix}members AS meml ON (meml.id_member = ml.id_member)' : '') . '
         WHERE t.id_board = {int:current_board}' . (!$modSettings['postmod_active'] || $context['can_approve_posts'] ? '' : '
            AND (t.approved = {int:is_approved}' . ($user_info['is_guest'] ? '' : ' OR t.id_member_started = {int:current_member}') . ')') . '
         ORDER BY ' . (!empty($modSettings['enableStickyTopics']) ? 'is_sticky' . ($fake_ascending ? '' : ' DESC') . ', ' : '') . $_REQUEST['sort'] . ($ascending ? '' : ' DESC') . '
         LIMIT {int:start}, {int:maxindex}',
         array(
            'current_board' => $board,
            'current_member' => $user_info['id'],
            'is_approved' => 1,
            'id_member_guest' => 0,
            'start' => $start,
            'maxindex' => $maxindex,
         )
      );
      $topic_ids = array();
      while ($row = $smcFunc['db_fetch_assoc']($request))
         $topic_ids[] = $row['id_topic'];
   }

   // Grab the appropriate topic information...
   if (!$pre_query || !empty($topic_ids))
   {
      // For search engine effectiveness we'll link guests differently.
      $context['pageindex_multiplier'] = empty($modSettings['disableCustomPerPage']) && !empty($options['messages_per_page']) && !WIRELESS ? $options['messages_per_page'] : $modSettings['defaultMaxMessages'];

      $result = $smcFunc['db_query']('substring', '
         SELECT
            t.id_topic, t.num_replies, t.locked, t.num_views, t.is_sticky, t.id_poll, t.id_previous_board,
            ' . ($user_info['is_guest'] ? '0' : 'IFNULL(lt.id_msg, IFNULL(lmr.id_msg, -1)) + 1') . ' AS new_from,
            t.id_last_msg, t.approved, t.unapproved_posts, t.is_solved, ml.poster_time AS last_poster_time,
            ml.id_msg_modified, ml.subject AS last_subject, ml.icon AS last_icon,
            ml.poster_name AS last_member_name, ml.id_member AS last_id_member,
            IFNULL(meml.real_name, ml.poster_name) AS last_display_name, t.id_first_msg,
            mf.poster_time AS first_poster_time, mf.subject AS first_subject, mf.icon AS first_icon,
            mf.poster_name AS first_member_name, mf.id_member AS first_id_member,
            IFNULL(memf.real_name, mf.poster_name) AS first_display_name, SUBSTRING(ml.body, 1, 385) AS last_body,
            SUBSTRING(mf.body, 1, 385) AS first_body, ml.smileys_enabled AS last_smileys, mf.smileys_enabled AS first_smileys
         FROM {db_prefix}topics AS t
            INNER JOIN {db_prefix}messages AS ml ON (ml.id_msg = t.id_last_msg)
            INNER JOIN {db_prefix}messages AS mf ON (mf.id_msg = t.id_first_msg)
            LEFT JOIN {db_prefix}members AS meml ON (meml.id_member = ml.id_member)
            LEFT JOIN {db_prefix}members AS memf ON (memf.id_member = mf.id_member)' . ($user_info['is_guest'] ? '' : '
            LEFT JOIN {db_prefix}log_topics AS lt ON (lt.id_topic = t.id_topic AND lt.id_member = {int:current_member})
            LEFT JOIN {db_prefix}log_mark_read AS lmr ON (lmr.id_board = {int:current_board} AND lmr.id_member = {int:current_member})'). '
         WHERE ' . ($pre_query ? 't.id_topic IN ({array_int:topic_list})' : 't.id_board = {int:current_board}') . (!$modSettings['postmod_active'] || $context['can_approve_posts'] ? '' : '
            AND (t.approved = {int:is_approved}' . ($user_info['is_guest'] ? '' : ' OR t.id_member_started = {int:current_member}') . ')') . '
         ORDER BY ' . ($pre_query ? 'FIND_IN_SET(t.id_topic, {string:find_set_topics})' : (!empty($modSettings['enableStickyTopics']) ? 'is_sticky' . ($fake_ascending ? '' : ' DESC') . ', ' : '') . $_REQUEST['sort'] . ($ascending ? '' : ' DESC')) . '
         LIMIT ' . ($pre_query ? '' : '{int:start}, ') . '{int:maxindex}',
         array(
            'current_board' => $board,
            'current_member' => $user_info['id'],
            'topic_list' => $topic_ids,
            'is_approved' => 1,
            'find_set_topics' => implode(',', $topic_ids),
            'start' => $start,
            'maxindex' => $maxindex,
         )
      );

谢谢你们,我已经忍受了整整一个星期了。

1 个答案:

答案 0 :(得分:0)

看起来你想要按照以下顺序排序主题:1)粘性,2)从查询字符串排序或如果为空,3)发布日期。

在汇总查询变量之前,请添加以下行:

$_REQUEST['sort'] = (empty($_REQUEST['sort'])) ? 'ml.poster_time' : $_REQUEST['sort'];

基本上这就是说如果还没有选择另一种排序方法(即按字母顺序排列),则默认按发布日期排序。