Перейти к контенту
  • 0

срочно нужна помощь по mysql


Total

Вопрос

Срочно надо разобратьбся с одним запросом, который ужасно тормозит мой форум, но в тоже время он 100% необходим.

 

SELECT COUNT(DISTINCT(t.tid)) as tcnt, COUNT(DISTINCT(p.pid)) as pcnt FROM ibf_posts p, ibf_topics t WHERE p.post_date < ".time()." AND p.post_date > ".$ibforums->member['last_visit']." AND p.topic_id=t.tid

 

Этот запрос выводит на главной странице "13 сообщений и 4 новых темы с последнего визита"

 

Вот сам хак в боардс.пхп:

 

if ($ibforums->member['id'])
        {
           $DB->query("SELECT COUNT(DISTINCT(t.tid)) as tcnt, COUNT(DISTINCT(p.pid)) as pcnt FROM ibf_posts p, ibf_topics t WHERE p.post_date < ".time()." AND p.post_date > ".$ibforums->member['last_visit']." AND p.topic_id=t.tid");
	 $row = $DB->fetch_row();
	 $data['topics_scince'] = $row[tcnt];
	 $data['posts_scince'] = $row[pcnt];
           $t_html = $this->html->msg_stats($data);
     $this->output = preg_replace( "/<!-- stats -->/" , "$t_html" , $this->output );
        }

 

 

что надо! Надо упростить запрос. Траблы либо в COUNT(DISTINCT(t.tid)) либо еще в чем.

 

Писал давно, и брал его из welcome панели. Наверняка можно новый запрос, более легкий, сделать который показывает сколько тем и сообщений НОВЫХ было с момента последнего визита.

 

Помогите плиз :D

Ссылка на комментарий
Поделиться на других сайтах

Рекомендуемые сообщения

  • 0

Пока спросони ничем не помогу. Надо копаться. Пока только могу предложить посмотреть откопанный мною хак new posts, сделанный не ламером в PHP:

 

    == New Posts ==

 

    Author: joshdw1

    E-Mail: joshdw1@ibhacks.com

    Website: http://www.ibresource.com

 

    This hack is made for IBResource (www.ibresource.com) and cannot be distributed on other weboage without explicit permission. If you would like to re-distribute this hack, please send an e-mail describing your reasons to joshdw1@ibhacks.com

 

    Description: This hack displays a link that will show all the new topics since your last visit

   

 

    ================================================================================

=============

    lang\en\lang_search.php

    ================================================================================

=============

    find this (around line 63):

 

    'active_no_topics' => "There were no active topics during those date ranges",

 

    ADD this directly AFTER that:

 

    'new_no_topics' => "There have been no new posts since your last visit",

   

 

   

 

    ================================================================================

=============

    sources\Search.php

    ================================================================================

=============

    find this (around line 123)

            case 'show':

                $this->show_results();

                break;

               

    ADD this directly AFTER that:               

               

            case 'newposts':

                $this->get_new_posts();

                break;

               

    Find this:

   

    function parse_entry($topic) {

        global $DB, $std, $ibforums;   

       

    ADD this directly BEFORE that:

 

    function get_new_posts() {

        global $ibforums, $DB, $std, $HTTP_POST_VARS;

       

        $DB->query("SELECT last_visit FROM ibf_members WHERE id='".$ibforums->member['id']."'");

        $info = $DB->fetch_row();

 

        $ibforums->input['cat_forum'] = 'cat';

        $ibforums->input['cats']      = 'all';

        $ibforums->input['forums']      = 'all';

                     

        $forums = $this->get_searchable_forums();

         

        $DB->query("SELECT DISTINCT(t.tid) FROM ibf_posts p, ibf_topics t WHERE p.post_date > $info[last_visit] AND p.forum_id IN($forums) and p.topic_id=t.tid ORDER BY t.last_post DESC LIMIT 0,200");

   

        $max_hits = $DB->get_num_rows();

   

        $topics = "";

   

        while ($row = $DB->fetch_row() )

        {

            $topics .= $row['tid'].",";

        }

   

        $DB->free_result();

   

        $topics = preg_replace( "/,$/", "", $topics );

   

        if ($topics == "")

        {

            $this->output .= $this->html->getnewstart();

            $this->output .= $this->html->new_none();

            $this->output .= $this->html->end("");

            $this->page_title = $ibforums->lang['search_results'];

            $this->nav        = array( "{$ibforums->lang['search_form']}", $ibforums->lang['search_title'] );

            return "";

        }

   

     

        $topic_string = implode( "," , array_slice( explode(",",$topics), $this->first, 25 ) );

       

        $url_words = urlencode(trim($keywords));

           

                                             

        $this->output .= $this->html->getnewstart( array( 'SHOW_PAGES' => "" ) );

               

        $DB->query("SELECT t.*, f.id as forum_id, f.name as forum_name FROM ibf_topics t, ibf_forums f WHERE t.tid IN($topic_string) and f.id=t.forum_id ORDER BY ".$this->sort_key." ".$this->sort_order." LIMIT 0,25");

       

        while ( $row = $DB->fetch_row() )

        {

            $row['keywords'] = $url_words;

            $this->output .= $this->html->RenderRow( $this->parse_entry($row) );

       

        }

       

        $this->page_title = $ibforums->lang['search_results'];

        $this->nav        = array( "{$ibforums->lang['search_form']}", $ibforums->lang['search_title'] );

       

        $this->output .= $this->html->end("");

       

    }

   

    ================================================================================

=============

    skin\s1\skin_boards.php

    ================================================================================

=============

    find this (around line 167):

 

function PageTop($lastvisit) {

global $ibforums;

return

   


 
     
     
 
   
<!-- IBF.NEWSLINK -->{$ibforums->lang['welcome_back_text']} $lastvisit
          {$ibforums->lang['sm_forum_leaders']} |
          {$ibforums->lang['sm_todays_posts']}

          {$ibforums->lang['sm_today_posters']} |
          {$ibforums->lang['sm_all_posters']}

          New posts since your last visit

         
     

EOF;

}

 

    REPLACE that with:

 

function PageTop($lastvisit) {

global $ibforums;

return

   


 
     
     
 
   
<!-- IBF.NEWSLINK -->{$ibforums->lang['welcome_back_text']} $lastvisit
          {$ibforums->lang['sm_forum_leaders']} |
          {$ibforums->lang['sm_todays_posts']}

          {$ibforums->lang['sm_today_posters']} |
          {$ibforums->lang['sm_all_posters']}

          New posts since your last visit

         
     

EOF;

}

 

    ================================================================================

=============

    skin\s1\skin_search.php

    ================================================================================

=============

    Find this around line 283

function active_none() {

global $ibforums;

return

{$ibforums->lang['active_no_topics']}

EOF;

}

 

    ADD this directly AFTER that

 

function new_none() {

global $ibforums;

return

{$ibforums->lang['new_no_topics']}

EOF;

}

 

function getnewstart() {

global $ibforums;

return

   

       

           

       

EOF;

}

   

   

 

 

 

 

 

    All done!   

 

 

 

 

   

 

 

   

 

 

 

New Topics

           

Ссылка на комментарий
Поделиться на других сайтах

  • 0

SELECT DISTINCT(t.tid) FROM ibf_posts p, ibf_topics t WHERE p.post_date > $info[last_visit] AND p.forum_id IN($forums) and p.topic_id=t.tid ORDER BY t.last_post DESC LIMIT 0,200

 

SELECT t.*, f.id as forum_id, f.name as forum_name FROM ibf_topics t, ibf_forums f WHERE t.tid IN($topic_string) and f.id=t.forum_id ORDER BY ".$this->sort_key." ".$this->sort_order." LIMIT 0,25

 

Я не думаю что это будет лучше. У меня появилась идея вообще-то:

 

Сделать отдельную страницу где будет этот скрипт, но не на главной. Только пока не знаю как это сделать :D

Ссылка на комментарий
Поделиться на других сайтах

  • 0
В принципе это очень даже легко... Только я не понял что должно выводится в итоге :D Кол-во новых сообщений/тем или же ссылки на них?
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Meowth[OGD]

Нет просто у меня проблема в том, что этот запрос грузится каждый раз на главной странице. При ЛЮБОМ ОБРАЩЕНИИ пользователя. А так я просто сделаю на главной ссылку на скрипт с этим запросом. И запрос будет выполняться только по желанию пользователя. Тем самым уменьшив загрузку на базу .. У меня с этим запросом страница грузится больше минуты, без него - меньше 2х сек. :D Идея понята ;) Только я не знаю как сделать отдельный файл с ним :)

Ссылка на комментарий
Поделиться на других сайтах

  • 0
Напиши мне плиз что выводится должно, я попробую замутить. Только не в аську потому что она глючит =(
Ссылка на комментарий
Поделиться на других сайтах

  • 0
Там - кое что сделал. Отдельную страницу делать не надо. Нужно, если это возможно, выводить числами сколько новых сообщений и топиков. Иначе говоря надо запрос (что я дал в первом посте) как-то разбить
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Total

Разбить запрос нафиг на два:

SELECT COUNT(p.pid) AS pcnt FROM ibf_posts p WHERE p.post_date < ".time()." AND p.post_date > ".$ibforums->member['last_visit'].";
SELECT COUNT(t.tid) AS tcnt FROM ibf_topics t WHERE t.last_post < ".time()." AND t.last_post > ".$ibforums->member['last_visit']."

:yes

Что-то вроде.

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить на вопрос...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.