Запрос с вычислением

Статус
Закрыто для дальнейших ответов.
Регистрация
17.02.2012
Сообщения
28
Здравствуйте, столкнулся с неожиданной проблемой.
Есть запрос:
Код:
SELECT SQRT( (latitude -48) * ( latitude -48 ) + ( longitude -37 ) * ( longitude -37 ) ) *111 AS L, users.*
FROM users
WHERE age >=18
AND age <=70
AND L<500
ORDER BY L DESC
LIMIT 0 , 30
Выдает ошибку, что не знает поля L. Попробовал обращаться по индексу ( 1 ), сортировка работает, а вот в WHERE получается 1<500...
Подскажите, пожалуйста, как решить это?
Заранее спасибо.
 

CamaroSS

Well-Known Member
Регистрация
21.02.2012
Сообщения
176
Потому что поля L нет в таблице? Можно применить SELECT из SELECT'а либо вот эту колбасу продублировать в условие, тогда запрос быстрее пройдёт.
 
Регистрация
17.02.2012
Сообщения
28
Потому что поля L нет в таблице? Можно применить SELECT из SELECT'а либо вот эту колбасу продублировать в условие, тогда запрос быстрее пройдёт.
Продублировав это в условие я решил проблему. Просто не хотел так писать. Зачем такие вычисления делать 2 раза? Учитывая количество строк, обрабатываемое запросом - запрос выполняется долго, а скорость критична в данном месте. Я думал есть какое-то решение, чтобы повысить скорость и читабельность запроса.
 

lekzd

parse error: parse error, unexpected T_STRING...
Регистрация
17.02.2011
Сообщения
1 125
чтобы повысить скорость
А вы тестируйте, тестируйте, MySQL тоже не дебилы пишут, оптимизации там присутствуют, уж подзапросы точно расчитываются и заменяются, вот только вопрос, везде ли?

читабельность запроса.
Код:
$get_L = 'SQRT( (latitude -48) * ( latitude -48 ) + ( longitude -37 ) * ( longitude -37 ) ) *111';

$sql = "
  SELECT $get_L AS L, users.*
FROM users
WHERE age >=18
AND age <=70
AND $get_L<500
ORDER BY $get_L DESC
LIMIT 0 , 30
";
как-то так
 
Регистрация
17.02.2012
Сообщения
28
Да, у меня сейчас как раз такой код, отличие только в названиях переменных ;) . Честно говоря я думал это не комильфо.
 
Статус
Закрыто для дальнейших ответов.
Верх Низ