[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Одним запросом
savelikan
привет всем! Вопрос по оптимизации скрипта. Скрипт выполняется около 20 секунд, всё дело в одной функции... Вот интересуюсь, можно одним запросом к БД читать и записать в БД?
Например, вот это выполнить одним скриптом?
@$SQLanswer = mysql_query("SELECT * FROM `testing_answers` WHERE `testing_answers-question` = '".$id."' ".$random);
@$TSTanswer = mysql_fetch_array($SQLanswer);
IF($TSTanswer==TRUE){
DO{
IF(mysql_query("INSERT INTO `testing_preresult` (
`testing_preresult-user` ,
`testing_preresult-hash` ,
`testing_preresult-type` ,
`testing_preresult-page` ,
`testing_preresult-question`
) VALUES (
'"
.$userid."',
'"
.$hash."',
'answer-"
.$insert_id ."',
'',
'"
.$TSTanswer['testing_answers-id']."'
)"
)==FALSE){
echo showerror_sql(mysql_error());
}
}
WHILE($TSTanswer = mysql_fetch_array($SQLanswer));
} else {
echo showerror_sql(mysql_error());
}


_____________
Одесса - мой город!)))
Valick
savelikan, есть INSERT .. SELECT, почитайте про него.


_____________
Стимулятор ~yoomoney - 41001303250491
sergeiss
Я правильно понял, что ты сначала считываешь данные из одной таблицы, а затем используешь их для записи в другую таблицу? При этом, вроде как, используются некоторые переменные, которые одинаковы для всех строк.
Если так, то тогда см. команду INSERT в таком формате:
INSERT INTO .....
SELECT .... FROM ....

То есть, ты выбранные SELECT'ом данные тут же вставляешь куда-то, в другую таблицу.

Другой вариант - сначала сформировать надо вставляемых данных и вставить их одним ИНСЕРТом:
INSERT INTO ....
(....)

values
(.....),
(.....),
(.....)

Второй вариант хорош тогда, когда данные нельзя получить простым СЕЛЕКТом, в силу любых причин.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
savelikan
Наверное первый вариант лучше.
Дело в том, що у меня сайт онлайн тестирования. Что-то типа moodle.
И есть такие базы данных:
-база с названиями тем
-база з вопросами
-база с вариантами ответа
-база с результатами тестирования
-база с даннымт о тесте, тоесть определяет в какой последовательности идут вопросы и в какой ответы так как при новом тестировании они в рандомном порядке.

И вот получается, что генерация страницы как бы в два етапа:
при первом заходе на тест сохраняется информация про последовательность вопросов и вариантов ответов, а на втором этапе по сохраненной информации собирается вопрос с ответом и отображается страница.

Дело в том, что на втором этапе время генерации страницы (тоесть при повторном заходе на тест или продолжении тестирования) время генерации страницы 0,2-0,4сек. А вот первый етап затягивается на 18-22 сек при том, что на втором этапе запросов к БД больше...

Везде получается запрос к БД в цыкле другого запроса... И наверное от этого такое время генерации страницы.

Вот например часть из первого этапа

$FORM = "test=numner=24=random"

WHILE($FORM[$i]==TRUE){
$FORMin = explode("=",$FORM[$i]);
IF($FORMin[0]=='test'){
IF($FORMin[1]=='number'){
IF(substr($FORMin[3],0,6)=='random')$random = ' ORDER BY RAND() ';
@$SQLquestion = mysql_query("
SELECT *
FROM `testing_questions`
WHERE `testing_questions-toppic` = '"
.$TSTtoppic['testing_toppic-id']."' ".$random."
LIMIT "
.$FORMin[2]."");
@$TSTquestion = mysql_fetch_array($SQLquestion);
IF($TSTquestion==TRUE){
DO{
test_preform_save($GLOBALuser['users_id'],$TSTtoppic['testing_toppic-id'],$FORMhash,$TSTquestion['testing_questions-type'],'test',$page,$TSTquestion['testing_questions-id'],$number,$FORMin[4]);
$number++;
IF($mode == 'studing')$page++;
}WHILE($TSTquestion = mysql_fetch_array($SQLquestion));
} else {
echo showerror_sql(mysql_error());
}
UNSET($random);
}
............


и далее
FUNCTION test_preform_save($userid,$toppicid,$hash,$questiontype,$type,$page,$id,$number,$answer){
IF(mysql_query("INSERT INTO `testing_preresult` (
`testing_preresult-user` ,
`testing_preresult-toppic` ,
`testing_preresult-hash` ,
`testing_preresult-type` ,
`testing_preresult-page` ,
`testing_preresult-question` ,
`testing_preresult-number`
) VALUES (
'"
.$userid."',
'"
.$toppicid."',
'"
.$hash."',
'"
.$type."',
'"
.$page."',
'"
.$id."',
'"
.$number."'
)
"
)==TRUE){
$insert_id = mysql_insert_id();
IF($answer=='')$random = ' ORDER BY RAND() ';
IF($questiontype==1 OR $questiontype==2 OR $questiontype==4){
@$SQLanswer = mysql_query("SELECT * FROM `testing_answers` WHERE `testing_answers-question` = '".$id."' ".$random);
@$TSTanswer = mysql_fetch_array($SQLanswer);
IF($TSTanswer==TRUE){
DO{
IF(mysql_query("INSERT INTO `testing_preresult` (
`testing_preresult-user` ,
`testing_preresult-hash` ,
`testing_preresult-type` ,
`testing_preresult-page` ,
`testing_preresult-question`
) VALUES (
'"
.$userid."',
'"
.$hash."',
'answer-"
.$insert_id ."',
'',
'"
.$TSTanswer['testing_answers-id']."'
)"
)==FALSE){
echo showerror_sql(mysql_error());
}
}
WHILE($TSTanswer = mysql_fetch_array($SQLanswer));
} else {
echo showerror_sql(mysql_error());
}
}


_____________
Одесса - мой город!)))
Быстрый ответ:

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