Вырезать из запроса все операторы сортировки ORDER BY
9 октября 2022
Для оптимизации запроса понадобилось удалить из запроса все операторы ORDER BY. К сожалению, использовать регулярные выражения можно только для простых запросов, не использующих вложенные подзапросы и скобки. Поэтому было решено сделать небольшую обработку, посимвольно анализирующую строку, но даже она начнёт сбоить, если в запросе будет иметься поиск по поисковому запросу вида WHERE `description` LIKE '%order by%', поэтому если решите использовать, то будьте аккуратны.
//Формируем запрос без функций ORDER BY
$arSplitOrder = preg_split("/order by/i", $sql);
foreach($arSplitOrder as $z => $str) {
if ($z == 0) continue;
$arSplitLimit = preg_split("/limit\s/i", $str);
$arChars = str_split($arSplitLimit[0]);
$countOpenBrackets = 0;
foreach($arChars as $n => $char) {
if ($char == '(') $countOpenBrackets++;
else if ($char == ')') $countOpenBrackets--;
if ($countOpenBrackets < 0) break;
$arChars[$n] = '';
}
$arSplitLimit[0] = implode('', $arChars);
$arSplitOrder[$z] = implode('LIMIT ', $arSplitLimit);
}
$sqlWithoutOrderBy = implode('', $arSplitOrder);