2010-12-05 4 views
3

안녕하세요, 저는 자동 증분 ID가 있고 매우 오래된 메시지가 맨 위에 표시되도록 데이터베이스를 복원 했으므로 일반적인 ID 대신 증분 인 poster_time을 사용하여 메시지를 정렬하고 싶습니다. 그 문제를 해결하기 위해 poster_time별로 정렬 할 수 있습니다.PHP 도움말과 병합하는 SQL 쿼리

나는이 문제를 직접 해결하려고 시도했지만 어떤 기능을 잃고 싶지는 않지만 여기에 시도하고 있습니다. 내가 알아 냈어요 내가 ml.poster_time 내가 매우 상단에있는 코드로 묶어서 어떻게 DESC 필요가 위의 코드를 사용하여 테스트 목적으로

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 

이에

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}', 

.

다음

구조

보드 구조 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, 
     ) 
    ); 

고마워 내가 지금 일주일이 앓고 있었어요.

+0

좋은 스크린 샷과 노력을 위해 +1 –

+0

덕분에 쉽게 혼란스러워집니다. – SSpoke

답변

0

주제를 1) 끈적임, 2) 검색어 문자열에서 정렬 또는 비어있는 경우, 3) 게시일 순으로 정렬하려는 경우가 있습니다.

당신이 당신의 쿼리 변수를 조립하기 전에이 줄을 추가 :

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

기본적으로이 다른 종류의 방법이 이미 선택되어 있지 않은 경우 (즉 알파벳), 다음 게시 된 날짜를 기준으로 정렬을 기본값으로 말하는됩니다 .