PHP MySQL - Как я могу сортировать результаты с разбивкой на страницы по вычисляемому полю?

Для контекста, хотя область применения не ограничивается этим, я использую CakePHP 2.4.4 с функцией разбиения на страницы. Это запрашивает результаты (с ORDER, LIMIT и OFFSET, я полагаю), и как только результаты возвращаются, я вычисляю поле. В этом случае пользователь вводит почтовый индекс, и после возврата результатов географическое расстояние между почтовым индексом поиска и почтовыми индексами результатов рассчитывается индивидуально. Я не могу заказать по этому, так как у меня есть только одна страница результатов за раз.

Как бы я сделал это вручную? Я думаю, что мог бы получить все результаты в запросе, затем рассчитать расстояние для каждого результата, затем упорядочить, а затем удалить те, которые не на этой странице, но это кажется очень дорогим. Автотрейдер, например, выдает сотни тысяч результатов, и их можно упорядочить по расстоянию, рассчитать тут же.

Математика в моем проекте выполняется на PHP, но я ожидаю, что это нужно переместить в запрос, но я думаю, что это делает его дорогим.

Как упорядочить все результаты по вычисляемому полю, фактически не хранящемуся в базе данных?


person StringsOnFire    schedule 30.01.2014    source источник
comment
Вы всегда должны указывать точную версию cakephp, которую вы используете.   -  person mark    schedule 30.01.2014
comment
добавил, спасибо, но в данном случае это только для контекста, думаю решение имело бы более широкий охват   -  person StringsOnFire    schedule 30.01.2014


Ответы (2)


Не уверен, что здесь PHP — правильное место для математики. Особенно, если в этой таблице есть много записей для фильтрации.

Вы можете посмотреть на http://www.dereuromark.de/2012/06/12/geocoding-with-cakephp/

Вы, кажется, работаете с расстояниями. В этой статье все расчеты выполняются непосредственно в SQL — с использованием виртуальных полей и чистого подхода через поведение. Попробуйте заставить это работать. Это не только облегчит вам работу с расстояниями или полями широты/долготы, но и сделает его СУХИМ.

Сортировка и фильтрация включены.

person mark    schedule 30.01.2014
comment
Глядя на детали CakePHP 3, я подумал, что лучше не начинать полагаться на виртуальные поля, поскольку они удаляются? Но посмотрю, спасибо! - person StringsOnFire; 30.01.2014
comment
Они перенесены на уровень модели в более родное решение. Так что они все еще существуют, только не под этим названием, а в виде лучшего встроенного решения. - person mark; 30.01.2014
comment
А, хорошие новости, так что виртуальное поле было бы хорошим решением. Однако, хотя в моем проекте вычисляемым полем является почтовый индекс, для дальнейшего использования мне нужно иметь возможность использовать свою собственную функцию для виртуального поля - вы знаете, как это сделать вручную, а не с помощью этого плагина? - person StringsOnFire; 30.01.2014
comment
Вам нужно быть более конкретным. У меня, например, есть таблица postal_codes, которая содержит все данные, включая lt/lng для каждого почтового индекса. Я использую эту географическую информацию о широте и долготе для создания условий запроса через виртуальное поле поведения. - person mark; 30.01.2014
comment
Это то, что я пытаюсь сделать, но без плагина. Таким образом, я могу сделать это снова для других расчетных данных в будущем, где нет плагина. Думаю нужно сделать виртуальное поле на лету перед поиском - person StringsOnFire; 30.01.2014

Если вы выполняете сложные вычисления, переместите код в процедуру хранения.

person uacaman    schedule 30.01.2014
comment
Как в хранимой процедуре БД или хранимой процедуре PHP? В любом случае, это на самом деле не отвечает на вопрос, как это сделать. - person StringsOnFire; 30.01.2014
comment
я не был в курсе, что в php есть хранимые процедуры - person uacaman; 30.01.2014
comment
* не то же самое - может выполнять ту же работу - person StringsOnFire; 30.01.2014