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

Статус
В этой теме нельзя размещать новые ответы.

MvKozyrev

Постоялец
Регистрация
5 Май 2007
Сообщения
128
Реакции
74
Делаю плагин к 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;
			}
		}
	}
}

?>
 
Объединяй запросы LEFT JOIN-ом.
...
p.s. если есть дамп этих двух таблиц и распишешь где там что, и какие в итоге поля нужны, думаю смогу составить готовый запрос.
 
Дамп скажи как сделать - сделаю.
Если пока по-простому, то есть две таблицы:
blogs - оттуда берутся данные о блогах, из которых будут выдергиваться посты и posts - где хранятся все данные о постах (заголовок, автор, контент), включая и количество комментов.

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

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

А еще лучше - стукнись в ПМ, так как понадобиться доступ (можешь создать миникопию для экспериментов).
 
Не стал вникать в суть скрипта, но если грубо:

в 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

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

Посмотри - может в сессии валяется идентификатор сайта :)
 
не ВПМУ переписывать, а скорей всего свои модули и их запросы к базе.
 
я так понимаю, сам плугин (или чего там) запросы к базе перепинывает...
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху