MYSQL добавляет JOIN для запроса

81
6

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

SELECT *,3956 * 2 * ASIN(SQRT( POWER(SIN(($orig_lat - abs(wlatitude)) * pi()/180 / 2),2) 
+ COS($orig_lat * pi()/180 ) * COS(abs(wlatitude) * pi()/180) * POWER(SIN(($orig_lon - wlongitude) * pi()/180 / 2), 2) ))
as distance FROM MYTABLE dest having distance < $dist ORDER BY distance

Как добавить это в запрос без ошибок?

LEFT JOIN OTHER_TABLE ON MYTABLE.column=OTHER_TABLE.column

спросил(а) 2014-01-13T16:30:00+04:00 6 лет, 9 месяцев назад
1
Решение
107

Не углубляйтесь в свой запрос, но это должно быть так.

SELECT
*,
3956 * 2 * ASIN(SQRT( POWER(SIN(($orig_lat - abs(wlatitude)) * pi()/180 / 2),2) + COS($orig_lat * pi()/180 ) * COS(abs(wlatitude) * pi()/180) * POWER(SIN(($orig_lon - wlongitude) * pi()/180 / 2), 2) ))
as distance
FROM MYTABLE dest
LEFT JOIN OTHER_TABLE ON MYTABLE.column=OTHER_TABLE.column
HAVING distance < $dist
ORDER BY distance

ответил(а) 2014-01-13T16:34:00+04:00 6 лет, 9 месяцев назад
58

Независимо от того, что вы будете делать, вы не получите "ошибок", а, скорее, результатов, которые вам не нужны.

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

Если соединение одно для многих, вы можете получить умноженное содержимое на левой стороне для каждого числа соответствующих строк с правой стороны, в зависимости от вашего состояния.

см. http://en.wikipedia.org/wiki/Relational_algebra#Joins_and_join-like_operators для логики соединения.

по вашему запросу и по любому другому запросу, технический заказ:

select # ... 
from # table
join # table
on # condition
join # another table
on # another condition
where # condition
group # clause
having # condition applied after grouping
order by # ..

,

ответил(а) 2014-01-13T16:34:00+04:00 6 лет, 9 месяцев назад
42

Используя левое соединение, возможно, есть возможность получить дубликаты, попробуйте это, используя различные, также используйте правильные псевдонимы для таблиц

SELECT DISTINCT 
*,
3956 * 2 * ASIN(
SQRT(
POWER(
SIN(
($orig_lat - ABS(dest.wlatitude)) * PI() / 180 / 2
),
2
) + COS($orig_lat * PI() / 180) * COS(ABS(dest.wlatitude) * PI() / 180) * POWER(
SIN(($orig_lon - dest.wlongitude) * PI() / 180 / 2),
2
)
)
) AS distance
FROM
MYTABLE dest
LEFT JOIN OTHER_TABLE o ON dest.column=o.column
HAVING distance < $dist
ORDER BY distance

ответил(а) 2014-01-13T16:35:00+04:00 6 лет, 9 месяцев назад
41

SELECT *, 3956 * 2 * ASIN(SQRT( POWER(SIN(($orig_lat - abs(wlatitude)) * pi()/180 / 2),2) 
+ COS($orig_lat * pi()/180 ) * COS(abs(wlatitude) * pi()/180) * POWER(SIN(($orig_lon - wlongitude) * pi()/180 / 2), 2) )) AS distance
FROM MYTABLE dest
LEFT JOIN OTHER_TABLE ON dest.column = OTHER_TABLE.column
HAVING distance < $dist ORDER BY distance

ответил(а) 2014-01-13T16:34:00+04:00 6 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема