[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Нагрузка из-за запроса в цикле?
Vulkan
Здравствуйте, вот думаю, есть такой код:


<?php
include 'header.php';
include 'sql.php';
include 'user_menu.php';
?>
<div style="width:550px;float:left;">
<
div style="width:350px;float:left;">
<?php
//Выводим группы
$groups = "SELECT * FROM groups";
$groups_result = mysql_query($groups)or die(mysql_error());
while($rows=mysql_fetch_assoc($groups_result))
{
$groups_id=$rows['id'];
$groups_name=$rows['name'];
$groups_description=$rows['text'];

//Начало запроса для дальнейшей проверки присутствия пользователя в группе
$my_groups = mysql_query("SELECT groups.id, groups.name, groups.author_id, groups.text, groups.admin_id, groups_user.group_id, groups_user.user_id FROM groups LEFT JOIN groups_user ON (groups.id=groups_user.group_id) WHERE groups_user.user_id='$user_id' and groups_user.group_id='$groups_id'");
$my_groups_result = mysql_num_rows($my_groups)or die(mysql_error()); //Выводим значения присутствия (1 или 0)
// Конец


echo "<span style=\"font-size:18px; padding-left:5px; font-family: Myriad Pro; font-weight:bold;\">$groups_name".'</span><BR>';
echo "<div style=\" padding-left:5px; padding-top:5px;\"><div style=\"width: 50px; margin-right: 5px; margin-top: 4px; height:50px; border:5px #ffaa5e solid; float:left;\"><img src=\"/group_foto.png\"/>".'</div>';
echo "<span style=\" font-size:14px; font-family: Myriad Pro;\">$groups_description".'</span></div>';

//Пример проверки наличия пользователя в группе
if(my_groups_result==1)
{
echo "</div><div style=\"width:199px;float:right;\"><a href=\"out_group.php?id=$groups_id\">Выйти из группы</a><br>";
}
elseif(my_groups_result==0)
{
echo "<a href=\"in_group.php?id=$groups_id\">Вступить в группу</a><br></div>";
}
//Конец проверки
}
?>
</div>


Думаю если будет вывод 10 групп на странице, то получается 10 запросов только для проверки... Скажите пожалуйста, это не будет нагружать БД?



Спустя 5 минут, 48 секунд (3.05.2010 - 17:29) vagrand написал(а):
1. Любой запрос нагружает БД, один больше другой меньше. Естественно что чем меньше запросов тем лучше;
2. Не совсем понятно по коду что ты пытаешься сделать;
3. Откуда взялась переменная $user_id?

Спустя 20 минут, 3 секунды (3.05.2010 - 17:49) Vulkan написал(а):
$user_id - id авторизованного пользователя который просматривает страницу, я сначала вывожу группы из БД, и потом для каждой группы делаю проверку на принадлежность авторизованного пользователя к этой группе, если он принадлежит выводит надпись "Выйти из группы", если нет - "Вступить в группу", а для этого нужно ид каждый группы, который узнаётся из цикла.

Спустя 5 минут, 31 секунда (3.05.2010 - 17:55) vagrand написал(а):
Ну в таком случае твой подход не оптимален. Можно сделать вот так:


$groupsInfo = mysql_query(
"SELECT groups.id, groups.name, groups.author_id, groups.text, groups.admin_id, groups_user.group_id, groups_user.user_id
FROM groups
LEFT JOIN groups_user ON (groups.id=groups_user.group_id)
WHERE groups_user.user_id='
$user_id'
);



А затем смотреть в цикли у какой из групп значение user_id будет пустым, в тех группах пользователь еще не состаит

Спустя 15 минут, 20 секунд (3.05.2010 - 18:10) Vulkan написал(а):
хм... спасибо) Что то я не додумался)) А ещё если не сложно, подскажите - посмотреть пустое ли значение user_id можно также mysql_num_rows?

Спустя 5 минут, 7 секунд (3.05.2010 - 18:15) vagrand написал(а):
mysql_num_rows() возвращет количество отобранных строк для запроса SELECT и ничего более.

Спустя 12 минут, 22 секунды (3.05.2010 - 18:28) Vulkan написал(а):
Ну а каким тогда способом?

Спустя 3 минуты, 40 секунд (3.05.2010 - 18:31) vagrand написал(а):
Не совсем понял что тебе непонятно.

Спустя 33 минуты, 17 секунд (3.05.2010 - 19:05) Vulkan написал(а):
Цитата (vagrand @ 3.05.2010 - 14:55)
А затем смотреть в цикли у какой из групп значение user_id будет пустым, в тех группах пользователь еще не состаит

Вот это, или я не так понял

Спустя 20 минут, 34 секунды (3.05.2010 - 19:25) vagrand написал(а):
Ну для того чтобы проверить переменную на пустоту можно юзать функцию empty()

Спустя 16 часов, 53 минуты, 27 секунд (4.05.2010 - 12:19) Vulkan написал(а):
Цитата (vagrand @ 3.05.2010 - 16:25)
Ну для того чтобы проверить переменную на пустоту можно юзать функцию empty()

Хм, я и не знал что empty() можно использовать для БД biggrin.gif Спасибо, vagrand

Спустя 2 часа, 4 минуты, 3 секунды (4.05.2010 - 14:23) vagrand написал(а):
Цитата
Хм, я и не знал что empty() можно использовать для БД biggrin.gif


Интересно, а причем тут БД? Мы говорим про проверку выбранных данных в цикле.

Спустя 20 минут, 20 секунд (4.05.2010 - 14:43) Vulkan написал(а):
Хм... что-то не работает:

<?php
include 'header.php';
include 'sql.php';
include 'user_menu.php';
?>
<div style="width:550px;float:left;">
<?php
$groups = "SELECT * FROM groups";
$groups_result = mysql_query($groups)or die(mysql_error());
$groupsInfo = "SELECT groups.id, groups.name, groups.author_id, groups.text, groups.admin_id, groups_user.group_id, groups_user.user_id
FROM groups LEFT JOIN groups_user ON (groups.id=groups_user.group_id) WHERE groups_user.user_id='
$user_id'";
$groupsInfoResult=mysql_query($groupsInfo)or die(mysql_error());
$row=mysql_fetch_assoc($groupsInfoResult);
$idd=$row['user_id'];
while($rows=mysql_fetch_assoc($groups_result))
{
$groups_id=$rows['id'];
$groups_name=$rows['name'];
$groups_description=$rows['text'];
echo "<div style=\"width:350px;float:left; margin-bottom:5px;\"><span style=\"font-size:18px; padding-left:5px; font-family: Myriad Pro; font-weight:bold;\">
$groups_name".'</span><BR>';
echo "<div style=\" padding-left:5px; padding-top:5px;\">
<div style=
\"width: 50px; margin-right: 5px; margin-top: 4px; height:50px; border:5px #ffaa5e solid; float:left;\"><img src=\"/group_foto.png\"/>".'</div>';
echo "<span style=\" font-size:14px; font-family: Myriad Pro;\">$groups_description".'</span></div>';
echo "</div><div style=\"width:199px;float:right;\"><a href=\"out_group.php?id=$groups_id\">Выйти из группы</a><br></div>";
if (empty($idd)){
echo "1</div>";
}
}

?>

Если например группа в БД одна, то выводит всё верно, а если их две, то уже проверка неправильно идёт... Запрос проверяет только по первой группе которой находит, может нужно
$row=mysql_fetch_assoc($groupsInfoResult);
$idd=$row['user_id'];
в цикл сделать?

Спустя 2 дня, 18 часов, 12 минут, 29 секунд (7.05.2010 - 08:56) Basili4 написал(а):
Добрый день в выше приведенном коде внисите $idd=$row['user_id']; в цикл и $row['user_id']; замените на $rows['user_id']; а перед циклом конструкцию $row=mysql_fetch_assoc($groupsInfoResult);
$idd=$row['user_id']; набок завалите - это каша масленая вроде все.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.