Хостился как то на мастерхосте, через месяц съехал, за это время бд лежала околов 80 часов, и была еще какая-то проблема, сайт в общем был не доступен более 120 часов, тех. поддержка, говорила, что мы решаем проблемы, но они постоянно всплывали.
для перебора необходимо использовать курсор
DECLARE m_cat_id INT;
DECLARE done INT;
DECLARE cur1 CURSOR FOR
SELECT `cat_id` FROM `cat_categ` WHERE `cat_parent_id`=m_info_id
/* стейт сработает, когда из запроса нечего выбирать */
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
REPEAT
FETCH cur1 INTO m_cat_id;
IF NOT done THEN
/* здесь нужный код, здесь довольно все просто, как и в пхп */
END IF;
UNTIL done END REPEAT;
так как массивов нет, скорее всего нужно создавать временную табличку для накопления, как вариант, можно накидать в строку, если нужен список идентификаторов для IN, но тогда придется динамически формировать запрос, это плохо отражается на производительность, можно сразу обрабатывать данные. Если необходимо расчитанные данные, чтобы потом фетчем вытянуть, то только создание таблички, можно кончно возвращать с помощью SELECT на каждую итерацию, но будет слишком много результатов, что тоже плохо отразится на быстродействии.
Что за кошмарный пример?
Переменные объявляются с помощью ключевого слова DECLARE с указанием типа, а не используются глобальные, это снижает скорость работы.
Динамические запросы не следует использовать, в данном случае можно просто IF в теле запроса использовать, что-то типа
SELECT SQL_CALC_FOUND_ROWS User.* FROM users User
WHERE IF(@firstname != '', User.first_name LIKE CONCAT(@firstname,'%'), 1);
пременные менять не стал.
DECLARE m_cat_id INT;
DECLARE done INT;
DECLARE cur1 CURSOR FOR
SELECT `cat_id` FROM `cat_categ` WHERE `cat_parent_id`=m_info_id
/* стейт сработает, когда из запроса нечего выбирать */
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
REPEAT
FETCH cur1 INTO m_cat_id;
IF NOT done THEN
/* здесь нужный код, здесь довольно все просто, как и в пхп */
END IF;
UNTIL done END REPEAT;
так как массивов нет, скорее всего нужно создавать временную табличку для накопления, как вариант, можно накидать в строку, если нужен список идентификаторов для IN, но тогда придется динамически формировать запрос, это плохо отражается на производительность, можно сразу обрабатывать данные. Если необходимо расчитанные данные, чтобы потом фетчем вытянуть, то только создание таблички, можно кончно возвращать с помощью SELECT на каждую итерацию, но будет слишком много результатов, что тоже плохо отразится на быстродействии.
Переменные объявляются с помощью ключевого слова DECLARE с указанием типа, а не используются глобальные, это снижает скорость работы.
Динамические запросы не следует использовать, в данном случае можно просто IF в теле запроса использовать, что-то типа
SELECT SQL_CALC_FOUND_ROWS User.* FROM users User
WHERE IF(@firstname != '', User.first_name LIKE CONCAT(@firstname,'%'), 1);
пременные менять не стал.