Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте!
У меня устаноылен форум phpBB 2.0.22 и трекер, на трекере еще установлены некоторые моды, включая и мод Медалей, медали выдаются за аплоад больше 300гб для облегчения выдачи данной медали сделан мод, который выводит из базы список всех кому пологается даная медаль.
Но он так грузит базу что, все на какое-то время приходит в ступор.
Помогите пожалуйста оптимизировать запрос, сам я ни как не пойму в чем проблема.
Неактивен
Поясните пожалуйста, что такое медали и почему они больше 300 гигабайт. Приведить сам запрос, который требуется оптимизировать.
Неактивен
rgbeast написал:
Поясните пожалуйста, что такое медали и почему они больше 300 гигабайт. Приведить сам запрос, который требуется оптимизировать.
медали-награды, выдаются пользавателям форумов за те или иные заслуги.
В моем случаи выдается тем кто раздал больше 300 гб, на трекере.
Вот так выглядит код мода для просмотра пользователей, которым нужно выдать медали.
<?php
/* Settings */
// Number of recent articles you wish to display
$medal_num_recent = 120;
define('IN_PHPBB', true);
$phpbb_root_path = './';
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.'.$phpEx);
$current_time = (isset($_GET['time']) && $_GET['time'] == 'all') ? 0 : time();
//
// Start session management
//
$userdata = session_pagestart($user_ip, PAGE_VIEWMEMBERS);
init_userprefs($userdata);
//
// End session management
//
//
// Generate page
//
$page_title = 'В помощь модератору!';
include($phpbb_root_path . 'includes/page_header.'.$phpEx);
$template->set_filenames(array(
'body' => 'medal_body_mod.tpl')
);
make_jumpbox('viewforum.'.$phpEx);
$sql2 = " SELECT DISTINCT tor.*, u.username, u.user_id, u.user_regdate, tr.user_id, tr.u_up_total, tr.u_down_total, tr.u_up_total/tr.u_down_total AS rat2, bl.ban_userid
FROM ( " . BT_TORRENTS_TABLE . " tor, " . USERS_TABLE . " u LEFT JOIN " . BT_USERS_TABLE . " tr ON u.user_id=tr.user_id)LEFT JOIN " . BANLIST_TABLE . " bl ON u.user_id=bl.ban_userid
WHERE bl.ban_userid Is Null
AND tr.u_up_total > 322122547200
AND (tr.u_up_total/tr.u_down_total) > 3
ORDER BY tr.u_up_total DESC";
if( !($result2 = $db->sql_query($sql2)) )
{
message_die(GENERAL_ERROR, "Could not query users $sql", '', __LINE__, __FILE__, $sql);
}
while($row2 = $db->sql_fetchrow($result2)) $users2[$row2['user_id']] = $row2;
if(is_array($users2))
{
$i = 0;
foreach($users2 as $row2)
{
$query2 = "SELECT count(*)
FROM " . MEDAL_USER_TABLE . "
WHERE user_id = '{$row2['user_id']}'
AND medal_id = 2";
$res2 = $db->sql_query($query2);
$res2 = $db->sql_fetchrow($res2);
$received2 = $res2['count(*)'];
$username2 = $row2['username'];
$user_id2 = $row2['user_id'];
$joined2 = create_date($lang['DATE_FORMAT'], $row2['user_regdate'], $board_config['board_timezone']);
$ratio2 = $row2['rat2'];
$download2 = $row2['u_down_total'];
$upload2 = $row2['u_up_total'];
$row_color2 = ( !($i % 2) ) ? $theme['td_color1'] : $theme['td_color2'];
$row_class2 = ( !($i % 2) ) ? $theme['td_class1'] : $theme['td_class2'];
if ($received2 < intval(($upload2)/322122547200)) {
$received2 = '<span style="color:green"><b><span style="font-size:30px">' . $received2 . '</b></span></span>';
}
else if ($received2 > intval(($upload2)/322122547200)){
$received2 = '<span style="color:red"><b><span style="font-size:30px">' . $received2 . '</b></span></span>';
}
$template->assign_block_vars('memberrow2', array(
'ROW_NUMBER2' => $i + ( $start + 1 ),
'ROW_COLOR2' => '#' . $row_color2,
'ROW_CLASS2' => $row_class2,
'USERNAME2' => $username2,
'JOINED2' => $joined2,
'EARNED2' => intval(($upload2)/322122547200),
'RECEIVED2' => $received2,
'UP_DOWN_RATIO2' => $ratio2,
'UP2' => humn_size ($upload2),
'DOWN2' => humn_size ($download2),
'U_VIEWPROFILE2' => append_sid("profile.$phpEx?mode=viewprofile&" . POST_USERS_URL . "=$user_id2"))
);
$i++;
}
}
$template->pparse('body');
include($phpbb_root_path . 'includes/page_tail.'.$phpEx);
?>
Неактивен
удалите тему, я сам разобрался!
Неактивен
А пользователей всего сколько?
Проблема здесь.
foreach($users2 as $row2)
{
$query2 = "SELECT count(*)
FROM " . MEDAL_USER_TABLE . "
WHERE user_id = '{$row2['user_id']}'
AND medal_id = 2";
$res2 = $db->sql_query($query2);
$res2 = $db->sql_fetchrow($res2);
Для каждого пользователя выполняется отдельный запрос.
Сделай все одним запросом.
К $sql2 привинти count(*) через GROUP BY
http://dev.mysql.com/doc/refman/5.1/en/select.html
Неактивен