2014-01-19 4 views
1

я попытался с помощью кода ниже, и это говоритЗЕЬЕСТА имеет разное количество столбцов

Использованного ЗЕЬЕСТ имеет разное количество столбцов

, потому что расстояние колонок добавляется еще во втором запросе. Как мне решить что-то вроде этого или я могу получить право заказа без столбца расстояния? Я очень ценю любую помощь.

SELECT * FROM 
(
    SELECT * FROM user u 
    INNER JOIN employee e ON (u.empid = e.empid) 
    INNER JOIN awards a ON (u.empid = a.empid) 
    WHERE u.empid = 123 

    UNION 

    SELECT * (3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122))+ sin(radians(37)) * sin(radians(lat)))) AS distance 
    FROM user u 
    INNER JOIN employee e ON (u.empid = e.empid) 
    INNER JOIN awards a ON (u.empid = a.empid) 
    HAVING distance < 25 
    ORDER BY distance 
) a 
ORDER BY timestamp DESC 
+0

Проблема заключается в том, что второй имеет один 'distance' и первый не делает, хотя я бы ожидать, что второй просто генерировать ошибку. Я не понял, что запятая после '*' является необязательной. –

+0

Спасибо, что посмотрели на него, я попробовал выполнить второй код и 1-й код отдельно, он отлично работает .btw Мне пришлось добавить ',' после '*'. Но как вы можете использовать 'UNION' для неравномерных столбцов, подобных приведенному выше случаю чем код, который вы предложили в предыдущем вопросе. Спасибо снова. – jason

ответ

0

Вы бы это исправить, добавив расстояние до первого запроса:

SELECT * FROM 
(
    SELECT *, NULL as distance FROM user u 
    INNER JOIN employee e ON (u.empid = e.empid) 
    INNER JOIN awards a ON (u.empid = a.empid) 
    WHERE u.empid = 123 

    UNION 

    SELECT *, (3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122))+ sin(radians(37)) * sin(radians(lat)))) AS distance 
    FROM user u 
    INNER JOIN employee e ON (u.empid = e.empid) 
    INNER JOIN awards a ON (u.empid = a.empid) 
    HAVING distance < 25 
    ORDER BY distance 
) a 
ORDER BY timestamp DESC; 
+0

Я получаю дублирующее имя столбца 'sno'. – jason

+0

Спасибо за код выше, он имеет смысл сейчас. Спасибо. – jason

+0

@ BarbC.Goldstein. , , Это очень сильное обвинение, тем более, что я сделал комментарий, объясняющий, что проблема была задолго до появления вашего сообщения. Это не редкость для двух человек, чтобы прийти к ответу и опубликовать в ближайшем времени близость. –

2

Это потому, что ваш первый SELECT и второй SELECT имеют различные количества столбцов, так как вы представили Distance во 2-й SELECT.

Так что попробуйте сделать Distance в первом запросе null или 0 следующим образом.

SELECT * FROM 
(
    SELECT *, 0 as Distance 
    FROM user u 
    INNER JOIN employee e ON (u.empid = e.empid) 
    INNER JOIN awards a ON (u.empid = a.empid) 
    WHERE u.empid = 123 

    UNION 

    SELECT *, (3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122))+ sin(radians(37)) * sin(radians(lat)))) AS distance 
    FROM user u 
    INNER JOIN employee e ON (u.empid = e.empid) 
    INNER JOIN awards a ON (u.empid = a.empid) 
    HAVING distance < 25 
    ORDER BY distance 
) a 
ORDER BY timestamp DESC 
+0

Спасибо за код, указанный выше. – jason

+0

Добро пожаловать. Это исправить вашу проблему? Если да, выберите это как ответ. http://meta.stackoverflow.com/help/someone-answers –

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