Перейти к содержимому

Фотография
- - - - -

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


  • Вы не можете создать новую тему
  • Закрытая тема Тема закрыта
Сообщений в теме: 5

#1 Александр Ермаков

Александр Ермаков

    Прохожий

    Топикстартер
  • Участник
  • 2
    28 сообщ.

Отправлено 13 Август 2013 в 14:11

Здравствуйте, столкнулся с неожиданной проблемой.
Есть запрос:
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...
Подскажите, пожалуйста, как решить это?
Заранее спасибо.
  • 0

Спонсор

#2 CamaroSS

CamaroSS

    Частый гость

  • Участник
  • 52
    176 сообщ.

Отправлено 13 Август 2013 в 16:52

Потому что поля L нет в таблице? Можно применить SELECT из SELECT'а либо вот эту колбасу продублировать в условие, тогда запрос быстрее пройдёт.

Сообщение отредактировал CamaroSS: 13 Август 2013 в 16:54

  • 0

#3 Александр Ермаков

Александр Ермаков

    Прохожий

    Топикстартер
  • Участник
  • 2
    28 сообщ.

Отправлено 13 Август 2013 в 18:13

Потому что поля L нет в таблице? Можно применить SELECT из SELECT'а либо вот эту колбасу продублировать в условие, тогда запрос быстрее пройдёт.


Продублировав это в условие я решил проблему. Просто не хотел так писать. Зачем такие вычисления делать 2 раза? Учитывая количество строк, обрабатываемое запросом - запрос выполняется долго, а скорость критична в данном месте. Я думал есть какое-то решение, чтобы повысить скорость и читабельность запроса.

Сообщение отредактировал Александр Ермаков: 13 Август 2013 в 18:17

  • 0

#4 lekzd

lekzd

    parse error: parse error, unexpected T_STRING...

  • V.I.P.
  • 428
    1 125 сообщ.

Отправлено 13 Август 2013 в 18:53

чтобы повысить скорость

А вы тестируйте, тестируйте, 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
";

как-то так
  • 0

#5 Александр Ермаков

Александр Ермаков

    Прохожий

    Топикстартер
  • Участник
  • 2
    28 сообщ.

Отправлено 13 Август 2013 в 19:25

Да, у меня сейчас как раз такой код, отличие только в названиях переменных ;) . Честно говоря я думал это не комильфо.
  • 0

#6 lekzd

lekzd

    parse error: parse error, unexpected T_STRING...

  • V.I.P.
  • 428
    1 125 сообщ.

Отправлено 13 Август 2013 в 19:52

Честно говоря я думал это не комильфо.

И правильно, надо юзать PDO
  • 0



Похожие темы Свернуть

  Название темы Форум Автор Статистика Последнее сообщение
Статистика

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых пользователей