Вырезать из запроса все операторы сортировки 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);