Как удалить цикл php, чтобы уменьшить количество запросов mysql - PullRequest
0 голосов
/ 27 апреля 2018

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

В большинстве случаев эти циклы можно извлечь для выполнения меньшего количества запросов с большим набором переданных параметров.

Однако я не уверен, как обработать этот конкретный запрос, когда ORDER BY и LIMIT 1 делают немного сложнее понять, как его оптимизировать. Любые пункты приветствуются о том, как подходить к этому типу запроса:

Пример:

$e   = array( ... );
foreach($e as $i=>j) {
    $sql = "SELECT a FROM b WHERE c = '".(int)$j."' ORDER BY f LIMIT 1";
    $res = $db->query($sql);
}

Возможным способом было бы выбрать без условий ORDER/LIMIT и фильтрацию в PHP через циклы PHP, но только 1 запрос, но есть ли лучший способ уменьшить возвращаемый набор результатов?

EDIT: Чтобы пояснить лучше, я добавлю еще немного информации. Если есть 5000 записей, которые в противном случае были бы возвращены в упрощенной структуре, указанной выше, то нам потребовалось бы 5000 в окончательном наборе результатов также после оптимизации запроса вне цикла. Предложение LIMIT 1 не позволяет сделать это во внешнем SQL, но я еще не нашел способ сделать это с помощью внутреннего или подзапроса. Именно этот элемент я хотел проверить в здравом уме с помощью лучшего / более опытного ума.

Любые указатели приветствуются! Спасибо

1 Ответ

0 голосов
/ 27 апреля 2018

Я думаю, что построение вашего запроса таким образом должно дать вам ожидаемые результаты:

SELECT a FROM b WHERE c in(1,2,3,4,5) GROUP BY c ORDER BY min(f);

Поскольку GROUP BY будет выводить только одну строку каждого столбца "c".

...