2017-01-25 3 views
1

Я читал, что вы не можете использовать ALIAS в предложении WHERE, но у меня все еще нет хорошего альтернативного решения для достижения того, что я пытаюсь сделать ниже. Что я могу сделать с расчетом DISTANCE, чтобы он был доступен в предложении WHERE?MYSQL с использованием псевдонима в предложении WHERE

SELECT n.nid AS nid, location.name AS location_name, (6371.0 * ACOS(SIN((location.latitude * RADIANS(1))) * SIN((28.755925 * RADIANS(1))) + COS((location.latitude * RADIANS(1))) * COS((28.755925 * RADIANS(1))) * COS((location.longitude * RADIANS(1)) - (-81.346395 * RADIANS(1))))) AS distance 
      FROM 
      node n 
      LEFT JOIN location_instance ON n.vid = location_instance.vid 
      LEFT JOIN location ON location_instance.lid = location.lid 
      WHERE (((n.status = '1') AND (n.type IN ('locations')) AND (distance <= 100))) 
      ORDER BY distance 
      LIMIT 10 
+1

Необходимо повторить его. – Uueerdo

ответ

4

MySQL расширяет использование пункта HAVING, которые могут быть использованы для этой цели. Если запрос не является агрегирующим запросом, то HAVING все еще выполняет фильтрацию, но он позволяет использовать псевдонимы.

Таким образом, вы можете написать:

SELECT n.nid AS nid, l.name AS l, (6371.0 * ACOS(SIN((l.latitude * RADIANS(1))) * SIN((28.755925 * RADIANS(1))) + COS((l.latitude * RADIANS(1))) * COS((28.755925 * RADIANS(1))) * COS((l.longitude * RADIANS(1)) - (-81.346395 * RADIANS(1))))) AS distance 
FROM node n LEFT JOIn 
    location_instance li 
    ON n.vid = li.vid LEFT JOIN 
    location l 
    ON li.lid = l.lid 
WHERE n.status = 1 AND n.type IN ('locations') 
HAVING distance <= 100 
ORDER BY distance 
LIMIT 10; 

Примечания:

  • Если status это число, которое кажется вероятным, то вы должны сравнить с числом, а не строка.
  • Табличные псевдонимы облегчают запись и чтение.
  • Хотя status и type может идти в пункте HAVING, я подозреваю, что они лучше в WHERE (я подозреваю, что HAVING может повлиять на выбор оптимизации).
  • Вы можете использовать подзапрос, но это сохранит все данные в таблице.
+0

Ничего себе, спасибо. Не думал, что HAVING будет работать с этим вычислением. – mrtonyb

+0

@mrtonyb - HAVING не ГДЕ. WHERE уменьшает количество строк и фильтрует набор результатов. поэтому где намного быстрее и может использовать индекс –

+0

Я бы не стал слишком беспокоиться о выборе оптимизации. Первоначально я думал о том, чтобы упомянуть HAVING, но такие опасения вызвали меня; теперь, когда у меня было больше времени для рассмотрения, при таком сложном вычислении условия, я сомневаюсь, что в предложении WHERE возможны какие-либо оптимизации ... возможно, даже быстрее, если MySQL не будет так рано относиться к нему. – Uueerdo

Смежные вопросы