2016-01-22 2 views
0

Я написал комплексный запрос , который не возвращает все запрошенные данные. Кажется, что INNER JOIN работает некорректно. Этот запрос возвращает правильный набор результатов, я просто пропускаю столбцы из объединенной таблицы.Mysql SELECT запрос HAVING в сочетании с INNER JOIN WHERE, не отображающий все запрошенные данные

Мои запросы:

SELECT Table1.Col1, Col2, Col3, Col4, Col5, Col6, (6371 * acos(cos(radians(?)) 
* cos(radians(lat)) * cos(radians(lng) - radians(?)) + sin(radians(?)) 
* sin(radians(lat)))) AS distance 
FROM Table1 
INNER JOIN Table2 
ON Table1.Col1 = Table2.Col1 
WHERE TABLE2.Col2 =? 
AND Table2.Col3 =? 
HAVING distance < ? 
ORDER BY distance 

Мой результат содержит только значения из Table1, почему не INNER JOIN работает?

EDIT: Я изменил свой запрос на это на основе ответа P.Jairaj, и это, кажется, работает для меня:

 SELECT T1.Col1, T1.Col2, T1.Col3, T1.Col4, T1.Col5, T1.Col6, T2.Col1, 
     (6371 * ACOS(COS(RADIANS('?')) * 
     COS(RADIANS(lat)) * COS(RADIANS(lng) - RADIANS('?')) + 
     SIN(RADIANS('?')) * SIN(RADIANS(lat)))) AS distance 
     FROM T1, T2 
     WHERE T1.Col1 = T2.Col1 
     AND T2.Col2 = '?' 
     AND T2.Col3 = '?' 
     HAVING distance < '?' 
     ORDER BY distance 
+0

попробовать 'левое внешнее join' – RamRaider

+0

Вы должны войти в привычку [принимать ответы] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work), которые помогут вам решить ваши проблемы. –

+0

Ответы, которые я привел ближе к решению, но не были на 100% правильными. Мне показалось, что если бы я принял их как ответ, это смутило бы будущих посетителей ... – user3055582

ответ

1

Попробуйте

SELECT t1.Col1, t1.Col2, t2.Col3, t1.Col4, t2.Col5, t2.Col6, (6371 * acos(cos(radians(?)) 
* cos(radians(lat)) * cos(radians(lng) - radians(?)) + sin(radians(?)) 
* sin(radians(lat)))) AS distance FROM Table1 t1, Table2 t2 
Where t1.Col1 = t2.Col1 
AND t2.Col2 =? AND t2.Col3 =? 
AND distance < ? 
ORDER BY distance 
+1

Зачем OP «попробуйте это»? *** Хороший ответ *** всегда будет объяснять, что было сделано, и почему это было сделано именно так, не только для OP, но и для будущих посетителей SO. –

+0

Это фактически работает с расстоянием HAVING вместо расстояния AND, потому что невозможно использовать WHERE или AND для псевдо-столбца, созданного оператором AS. Но может ли кто-нибудь объяснить мне, если это правильный способ выбора из нескольких столбцов или мне нужно использовать JOIN? – user3055582

2

Вы не указали вторую таблицу на все выбранные элементы. Например, если вы хотите что-то от Table2 вы бы утверждать, что:

SELECT Table1.Col1, Table1.Col2, Table2.Col1, Table2.Col2 

Для каждого столбца вы утверждаете, вы должны быть четко о выборе таблицы.

+0

Вы правы, я отредактировал это в своем запросе. Спасибо – user3055582

-2

попытаться иметь вместо того, и где означает, что вы можете попробовать

HAVING TABLE2.Col2 =? AND Table2.Col3 =? AND distance < ? ORDER BY distance 
+0

Вы заменяете 'WHERE'' HAVING'? Это не сработает, это вызовет синтаксическую ошибку. –

+0

Я пробовал это, но это дало мне синтаксическую ошибку – user3055582

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