1113 Я знаю, что этот вопрос старый, но я даю следующий ответ в ответ на другой вопрос, который указывался здесь после того, как был отмечен как дубликат. Это еще одна альтернатива, о которой я не упоминаю в текущих ответах.
Я знаю, что есть функция с именем max, но она не работает с многомерным массивом, подобным этому.
Вы можете обойти это с помощью array_column
, что делает получение максимального значения очень простым:
$arr = [['message_id' => 1,
'points' => 3],
['message_id' => 2,
'points' => 2],
['message_id' => 3,
'points' => 2]];
// max value
$max = max(array_column($arr, 'points'));
Получение ассоциативного ключа - это то, где он получает немного больше хитро, учитывая, что вам может понадобиться несколько ключей (если $max
соответствует более чем одному значению). Вы можете сделать это с помощью анонимной функции внутри array_map
и использовать array_filter
для удаления значений null
:
// keys of max value
$keys = array_filter(array_map(function ($arr) use ($max) {
return $arr['points'] == $max ? $arr['message_id'] : null;
}, $arr));
Вывод:
array(1) {
[0]=>
int(1)
}
Если вы в конечном итоге набрали несколько ключей, но интересуетесь только первым найденным соответствием, просто обратитесь к $keys[0]
.
Попробуйте выполнить запрос перед выполнением вашего select:
SET SQL_BIG_SELECTS=1
Действительно ли это выполняется для огромного набора данных? В противном случае эту проблему следует решить другим способом.
Эффект параметра задокументирован на http://dev.mysql.com/doc/refman/5.0 /en/server-system-variables.html#sysvar_max_join_size .
Вам следует более строго фильтровать задействованные записи (чтобы в каждой части запроса было меньше записей). Если возможно, начните с таблицы, в которой вы можете отфильтровать большинство записей с помощью простого предложения WHERE.