[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вывод значений в цикле
zvezda_t
Здравствуйте, уважаемые программисты! :)

Подскажите мне пожалуйста, как правильно оптимизировать следующую ситуацию:


//Есть запрос формирующий список пользователей, пример запроса(на самом деле он меняется в зависимости от условий)
$result=mssql_query("SELECT id FROM dbo.users WHERE field='".@$field."' ");

//этот список запоминаю в сессию
while( $row=mssql_fetch_array($result) )
{
$_SESSION['rr']=$row['id'];
}

//разного рода сортировки, с обновлением страницы...

//далее идет вывод информации о всех пользователях

$mm=$_SESSION['rr'];

foreach($mm as $key=>$user_id)
{
//извлекаем информацию о пользователе
$results=mssql_query("SELECT name, lastname FROM dbo.info WHERE id_user='".@$user_id."' ");
list($name, $lastname)=mssql_fetch_array($results);

//извлекаем дополнительную информацию о пользователе
$results=mssql_query("SELECT date1, work FROM dbo.info_work WHERE id_user='".@$user_id."' ");
list($date1, $work)=mssql_fetch_array($results);

//print "пользователь:".$name." ".$lastname;
//...

}


запросов в цикле около 10, и время на их выполнение : 0.09 сек
если пользователей 10, то не заметно, а если 100 - то страничка грузится 9 секунд.
Как правильно организовать вывод, чтоб не было потерь во времени?



Спустя 1 час, 22 минуты, 54 секунды (22.11.2010 - 09:19) linker написал(а):
Может сразу первым запросом все и вытянуть? И сохранять не в сессию, а в memcache?
SELECT `u`.`id`, `i`.`name`, `i`.`lastname`, `iw`.`datel`, `iw`.`work` FROM `dbo`.`users` AS `u`
LEFT JOIN `dbo`.`info` as `i` ON `i`.`id_user` = `u`.`id`
LEFT JOIN `dbo`.`info_work` as `iw` ON `iw`.`id_user` = `u`.`id`
WHERE `u`.`field` = '" . @$field
Вообще неплохо было бы объединить две таблицы `users` и `info` в одну таблицу `users`, тут жесткая связь 1 к 1, а значит нет смысла хранить эти данные относящиеся к одной сущности в разных таблицах. А так же подумать на счет `info_work`, как тут связь?

Спустя 8 минут, 43 секунды (22.11.2010 - 09:28) zvezda_t написал(а):
linker, спасибо за предложение! Я подумаю как перестроить бд)

Еще такая мысль у меня появилась:
перед циклом вызвать представление(объединить в него все запросы из цикла), и передать в него массив айдишников пользователя, данные полученные из представления записать в массивы и уже эти массивы в цикле выводить на печать))
насколько это правильно? rolleyes.gif

Спустя 3 минуты, 19 секунд (22.11.2010 - 09:31) linker написал(а):
А вьюхи разве могут "иметь" несколько запросов?

Спустя 23 минуты (22.11.2010 - 09:54) zvezda_t написал(а):
Цитата
А вьюхи разве могут "иметь" несколько запросов?

Я так представляю:

dbo.View_user
SELECT `u`.`id`, `i`.`name`, `i`.`lastname`, `iw`.`datel`, `iw`.`work` FROM `dbo`.`users` AS `u`
LEFT JOIN `dbo`.`info` as `i` ON `i`.`id_user` = `u`.`id`
LEFT JOIN `dbo`.`info_work` as `iw` ON `iw`.`id_user` = `u`.`id`



//Есть запрос формирующий список пользователей
$result=mssql_query("SELECT id FROM dbo.users WHERE field='".@$field."' ");

//этот список запоминаю в сессию
while( $row=mssql_fetch_array($result) )
{
$_SESSION['rr']=$row['id'];
}

//разного рода сортировки, с обновлением страницы...

//далее идет вывод информации о всех пользователях

$mm=$_SESSION['rr'];

//----------------1------------------------
foreach($mm as $key=>$user_id)
{
$result=mssql_query("SELECT * FROM dbo.View_user WHERE id=".$user_id."");
$row=mssql_fetch_array($result);

//print "пользователь:".$row['name']." ".$row['lastname'];
//...

}

//------------------2------------------------

//или так, но не совсем понятно как сделать:

$result=mssql_query("SELECT * FROM dbo.View_user WHERE id=???");//тут не знаю как массив передать
while( $row=mssql_fetch_array($result) )
{
//print "пользователь:".$row['name']." ".$row['lastname'];
//...

}

Спустя 3 минуты, 14 секунд (22.11.2010 - 09:57) zvezda_t написал(а):
Цитата
Может сразу первым запросом все и вытянуть?

дело в том что сам первый запрос - он тоже меняется постоянно - он в другом месте формируется

Спустя 8 минут, 25 секунд (22.11.2010 - 10:06) kirik написал(а):
Цитата (linker @ 22.11.2010 - 01:19)
И сохранять не в сессию, а в memcache?

мемкэш на винде не самое хорошее решение..

Спустя 20 минут, 13 секунд (22.11.2010 - 10:26) linker написал(а):
Нормальное, у меня работает и не парюсь. Тем более не обязательно его иметь на той же машине, что и веб-сервер с пыхом.

Спустя 4 минуты, 49 секунд (22.11.2010 - 10:31) linker написал(а):
С вьюхами я не знай как, но вот как вариант
$result=mssql_query("SELECT id FROM dbo.users WHERE field='".@$field."' ");
...

$res = mysql_query("SELECT `i`.`name`, `i`.`lastname`, `iw`.`datel`, `iw`.`work` FROM `dbo`.`info` AS `i`
LEFT JOIN `dbo`.`info_work` as `iw` ON `iw`.`id_user` = `i`.`id`
WHERE `i`.`id_user` IN ("
. implode(",", $_SESSION['rr']) . ")");
А базу я бы нормализовал таки и было бы еще лучше.

Спустя 12 минут, 39 секунд (22.11.2010 - 10:44) zvezda_t написал(а):
linker
ух ты здорово!)))
Буду делать так! благодарю))) теперь понятно smile.gif smile.gif smile.gif

Спустя 3 часа, 49 минут, 41 секунда (22.11.2010 - 14:33) SlavaFr написал(а):
Цитата (zvezda_t @ 22.11.2010 - 06:28)
linker, спасибо за предложение! Я подумаю как перестроить бд)

Еще такая мысль у меня появилась:
перед циклом вызвать представление(объединить в него все запросы из цикла), и передать в него массив айдишников пользователя, данные полученные из представления записать в массивы и уже эти массивы в цикле выводить на печать))
насколько это правильно? :rolleyes:

a зачем? какая для этого причина?
по моему предложеный sql-запрос который в начале написал @linker является абсолютно ефективным и правельным.
также загаживание сесии идишниками юзера тоже не особо хорошая идея, но если ты все же на это решилась, то можеш наляпать эти идшки и во время считывания запроса который @linker написал.
к стате так как ты написала:

//этот список запоминаю в сессию
while( $row=mssql_fetch_array($result) )
{
$_SESSION['rr']=$row['id'];
}

то в сессии не какова списка не будет. будет просто последнее id записанно

Спустя 8 минут, 54 секунды (22.11.2010 - 14:42) linker написал(а):
Да, тут больше бы подошло
$_SESSION['rr'][] = $row['id'];

Спустя 18 минут (22.11.2010 - 15:00) zvezda_t написал(а):
SlavaFr
а ну да) на самом деле так:

while( $row=mssql_fetch_array($result) )	
{
$m_id[]=$row['id'];
}

$_SESSION['rr']=$m_id;


_____________

Что ты сделал сегодня - для завтра?
"Приидите ко Мне вси труждающиеся и обремененнии и Аз упокою вы, возмите иго Мое на себе и научитеся от Мене яко кроток есмь и смирен сердцем и обрящете покой душам вашим, иго бо Мое благо и бремя Мое легко есть."(Мф. 11:28-30)
Быстрый ответ:

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