1. Задавайте здесь вопросы о коде, которые не подходят в другие разделы, такие как:
    Дизайн > Верстка
    PHP > Как сделать на PHP
    Скрыть объявление

Пересортировать полученные из MySQL значения

Тема в разделе "Web Coding", создана пользователем MvKozyrev, 7 янв 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. MvKozyrev

    MvKozyrev Постоялец

    Регистр.:
    5 май 2007
    Сообщения:
    135
    Симпатии:
    70
    Делаю плагин к wpmu, который будет выводить самые комментируемые посты за день.
    Проблема в том, что данные о "постах за день" и "количестве комментов" хранятся в разных таблицах. И выбор из первой таблицы предполагает сортировку по времени написания поста. А второй запрос уже выполняется внутри первого и сортировка получается сначала по по времени, а потом уже по комментам. Искал в Нете - либо пишут, что никак, либо советуют забивать первую выборку в массив и извлекать .js'ом.
    Посоветуйте, как сделать эту чертову сортировку by comment_count. :bc:
    PHP:
    <?php

    function display_content_of_most_commented_posts_from_all_blogs($how_many 10) {
        global 
    $wpdb$wpmuBaseTablePrefix;
        
    $counter 0;
        
    // get a list of blogs in order of most recent update
        
    $blogs $wpdb->get_col("SELECT blog_id FROM $wpdb->blogs WHERE
            last_updated >= DATE_SUB(CURRENT_DATE(), INTERVAL 10 DAY)
            AND archived = '0'
            AND mature = '0'
            AND spam = '0'
            AND public = '1'
            AND deleted = '0'
            "
    );
        
    //с**а! Сортирует по дате создания поста
        
    if( is_array$blogs ) ) {
            foreach (
    $blogs as $blog) {

                
    // we need _posts and _options tables for this to work

                
    $blogOptionsTable $wpmuBaseTablePrefix.$blog."_options";
                
    $blogPostsTable $wpmuBaseTablePrefix.$blog."_posts";

                
    $options $wpdb->get_results("SELECT option_value FROM
                    
    $blogOptionsTable WHERE option_name IN ('siteurl','blogname')
                    ORDER BY option_name DESC"
    );
                  
                                           
    // we fetch the title and link for the latest post

                
    $thispost $wpdb->get_results("SELECT post_title, post_date, post_content, post_password, comment_count, post_author, guid
                    FROM 
    $blogPostsTable WHERE
                    post_status = 'publish'
                    AND post_type = 'post'
                    AND comment_count > '0'
                    ORDER BY comment_count DESC"
    );

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

                // comments

                        
    $count $thispost[0]->comment_count;

                
    // if it is found put it to the output
                
    if(($thispost) && empty($thispost[0]->post_password)){
                    
    $content $thispost[0]->post_content;
                    
    $content apply_filters('the_content'$content);
                    
    $content str_replace(']]>'']]&gt;'$content);
                            
    $content strip_tags($content);
                            
    $excerpt_length 30;
                            
    $words explode(' '$content$excerpt_length 1);
                            if (
    count($words) > $excerpt_length) {
                                    
    array_pop($words);
                                    
    array_push($words'[...]');
                                    
    $content implode(' '$words);
                            }
                    echo 
    $thispost[0]->post_password;
                     echo 
    '<div class="entry">';
                    echo 
    '<h3 class="entrytitle"><a href="'.$thispost[0]->guid.'">'.$thispost[0]->post_title.'</a></h3>';
                    echo 
    '<small>'.$thispost[0]->post_date.'</small><br />';
                    echo 
    '<strong>Блог:</strong> <a href="'.$options[0]->option_value.'">'.$options[1]->option_value.'</a>';
                    echo 
    '<div class="entrybody">'.$content.'</div>';
                    echo 
    '<p>'
                    
    '<a href="'.$thispost[0]->guid.'">читать полностью</a> | '
                    
    '<a href="'.$thispost[0]->guid.'#comments">комментарии</a> ('.$count.') | ';
                    echo 
    'Перейти на <a href="'.$options[0]->option_value.'"> '.$options[1]->option_value.'</a></div><hr />';
                    
    $counter++;
                }
                
    // don't go over the limit
                
    if($counter >= $how_many) {
                    break;
                }
            }
        }
    }

    ?>
     
  2. censored!

    censored!

    Регистр.:
    3 авг 2007
    Сообщения:
    293
    Симпатии:
    106
    Объединяй запросы LEFT JOIN-ом.
    ...
    p.s. если есть дамп этих двух таблиц и распишешь где там что, и какие в итоге поля нужны, думаю смогу составить готовый запрос.
     
  3. MvKozyrev

    MvKozyrev Постоялец

    Регистр.:
    5 май 2007
    Сообщения:
    135
    Симпатии:
    70
    Дамп скажи как сделать - сделаю.
    Если пока по-простому, то есть две таблицы:
    blogs - оттуда берутся данные о блогах, из которых будут выдергиваться посты и posts - где хранятся все данные о постах (заголовок, автор, контент), включая и количество комментов.

    Самое главное здесь - это получить в результате первой выборки blog_id, который обозначается, как $blog т.к. таблица posts в блоге имеет вид wpmuBaseTablePrefix.blog_id.posts. Здесь эту таблицу для выборки получаем присвоив $blogPostsTable = $wpmuBaseTablePrefix.$blog."_posts";.
    Теперь, когда вторая таблица определена, из нее выбираем все, что надо. Но первая сортировка уже сделана по времени создания поста:(.

    PS. Я в первом посте полный код плагина привел. Пока дампа нету, может пригодится?
     
  4. censored!

    censored!

    Регистр.:
    3 авг 2007
    Сообщения:
    293
    Симпатии:
    106
    Сделай дампером:
    http://sypex.net
    А еще лучше - стукнись в ПМ, так как понадобиться доступ (можешь создать миникопию для экспериментов).
     
  5. Vio

    Vio Создатель

    Регистр.:
    28 май 2007
    Сообщения:
    34
    Симпатии:
    2
    Не стал вникать в суть скрипта, но если грубо:

    в table1 коменты
    в table2 данные о кол-ве постов
    Код:
    SELECT t1.comment 
    FROM table1 as t1 
    LEFT JOIN table2 as t2 ON (t1.id = t2.comment_id)
    ORDER by t2.comment_count
    GROUP BY t1.comment
    
    Думаю модель понятна.
     
  6. MvKozyrev

    MvKozyrev Постоялец

    Регистр.:
    5 май 2007
    Сообщения:
    135
    Симпатии:
    70
    Спасибо всем за ответы, но проблема, к сожалению, отпала.
    "К сожалению" - это 150 запросов к БД и 0,5 сек генерации страницы (при нулевом трафике) с тем, что на ней уже есть :(.
    В общем, тут уже возникает вопрос, как оптимизировать работу с БД в WPMU.
     
  7. Jeurey

    Jeurey

    Регистр.:
    13 сен 2006
    Сообщения:
    419
    Симпатии:
    576
    Переписывать wpmu )
    Например, делать запросы по id сайта, который сейчас смотрится...

    Посмотри - может в сессии валяется идентификатор сайта :)
     
  8. difour

    difour Прохожие

    не ВПМУ переписывать, а скорей всего свои модули и их запросы к базе.
     
  9. Jeurey

    Jeurey

    Регистр.:
    13 сен 2006
    Сообщения:
    419
    Симпатии:
    576
    я так понимаю, сам плугин (или чего там) запросы к базе перепинывает...
     
Статус темы:
Закрыта.