Codeigniter ГДЕ на поле "КАК" - PullRequest
       351

Codeigniter ГДЕ на поле "КАК"

0 голосов
/ 17 ноября 2009

У меня есть запрос, в котором мне нужно изменить выбранные данные, и я хочу ограничить свои результаты этими данными. Например:

SELECT table_id, радианы (25) AS рад ОТ test_table ГДЕ рад <5 ПОРЯДОК рад рад ASC; </p>

Где это зависает, это 'rad <5', потому что согласно codeigniter нет столбца 'rad'. Я пытался написать это как пользовательский запрос ($ this-> db-> query (...)), но даже это не позволит мне. Мне нужно ограничить свои результаты на основе этого поля. Да, и ORDER BY работает отлично, если я уберу фильтр WHERE. Результаты упорядочены ASC по рад-полю.

HELP !!!

1 Ответ

0 голосов
/ 17 ноября 2009

Для многих СУБД нам нужно повторить формулу / выражение в предложении where, т.е.

SELECT table_id, radians( 25 ) AS rad 
FROM test_table 
WHERE radians( 25 ) < 5 
ORDER BY radians( 25 ) ASC

Однако в этом случае, поскольку вычисляемый столбец является константой, сам запрос не имеет особого смысла. Возможно, отсутствовала часть, например, в радианах (25 * myColumn) или что-то в этом роде?

Редактировать (следующая информация об истинной природе формулы и т. Д.)
Вы, кажется, разочарованы, потому что формула должна быть повторена ... Несколько комментариев по этому поводу:

Тот факт, что формула должна быть явно * прописана, а не псевдоним , может сделать запрос менее читабельным, менее удобным для написания и т. Д. (Подробнее об этом ниже), но чем больше Важным фактором, который следует учитывать , является то, что формула, используемая в предложении WHERE, заставляет СУБД рассчитать это значение для потенциально всех записей в базовой таблице !!!

Это в свою очередь снижает производительность несколькими способами:

  • SQL может не иметь возможности использовать некоторые индексы, и вместо этого придется сканировать таблицу (или ее части)
  • если формула тяжелая, это одновременно и медленный ответ, и менее масштабируемый сервер

Ситуация не так плоха, если дополнительные предикаты в предложении WHERE позволяют SQL отфильтровывать [значительное количество] записей, которые в противном случае были бы обработаны. Такие дополнительные критерии поиска могут определяться приложением (например, в дополнение к этому условию для радианта, [несвязанная] высота местоположения должна быть ниже 6000 футов), или такие критерии могут быть добавлены «искусственно», чтобы помочь с запрос (например, вы можете знать о грубой эвристике, которая недостаточна для вычисления значения «радиан» с приемлемой точностью, но может быть достаточно хорошей, чтобы отфильтровывать 70% записей, сохраняя только те из них, которые имеют шанс удовлетворяющий точному диапазону, требуемому для «радиана».

Теперь несколько трюков, касающихся самой формулы, в попытке сделать ее быстрее:

  • помните, что вам может не потребоваться выполнить 100% формулы учебника.
    Я не уверен, какая часть математики большого круга имеет отношение к этому вычислению радиана, но говоря в общих терминах, некоторые формулы включают в себя дорогой шаг, такой как извлечение квадратного корня, вызов функции триггера и т. Д. В некоторых случаях может быть возможно упростить формулу (которую необходимо выполнить для многих записей / значений), применив шаг reverse к другой стороне предиката (который, как правило, нужно оценивать только один раз ). Например, если, скажем, предикат условия поиска равен "WHERE SQRT((x1-x2)^2 + (y1-y2)^2) > 5". Так как вычисление расстояния включает в себя поиск квадратного корня (из суммы квадратов разностей), можно решить удалить квадратный корень и вместо этого сравнить результаты этой модифицированной формулы с квадратом значения расстояния по вертикали, то есть "WHERE ((x1-x2)^2 + (y1-y2)^2) > (5^2)"
  • В зависимости от вашей системы SQL / СУБД, может оказаться возможным реализовать формулу в определенной пользователем функции, что сделает ее более эффективной (поскольку «предварительно скомпилировано», может быть написано на лучшем языке и т. Д.) и короче, чтобы ссылаться, в самом запросе SQL (событие, хотя это потребовало бы быть перечисленным дважды, как сказано)
  • В зависимости от ситуации, также может быть возможно изменить схему базы данных и базовое приложение, чтобы иметь формулу (или ее части), но предварительно вычислить и проиндексировать, сохранив СУБД это длинное разрешение на основе функции предиката .
...