2016-10-09 6 views
2

Что в основном я хочу сделать, это выбрать все координаты от roadData один за другим, а затем найти все точки в tweetMelbourne в пределах 20 миль от него и вставить эти точки в другую таблицу ,с помощью первого оператора SQL результат в другой SQL заявление

Таким образом, для каждого (x,y) в roadData таблице найти соседние точки данных из tweetMelbourne и вставить эти точки в другую новую таблицу.

Так что я должен сделать это:

SELECT geo_coordinates_latitude, geo_coordinates_longitude 
FROM tweetmelbourne 
HAVING (3959 * acos(cos(radians(latitude)) * cos(radians(geo_coordinates_latitude)) * 
cos(radians(geo_coordinates_longitude) - radians(longitude)) + sin(radians(latitude)) * 
sin(radians(geo_coordinates_latitude)))) < .1 ORDER BY distance LIMIT 0 , 20; 

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

select longitude,latitude from roadData; 

описывают tweetmelbourne;

enter image description here

описывают roadData;

enter image description here

SELECT geo_coordinates_latitude, geo_coordinates_longitude 
FROM tweetmelbourne; 

enter image description here

select longitude,latitude from roadData; 

enter image description here

+0

Вам нужно разделить его на два подзапроса: 'WHERE x in (...) AND y in (...)'. –

+0

Это не имеет никакого смысла. Предложение WHERE используется для выбора строк в 'student'. – Barmar

+0

Как связаны таблицы «ученик» и «твит» друг с другом? Есть ли столбец 'student_id' в таблице' tweet'? – Barmar

ответ

0

Правильный синтаксис IN() с несколькими аргументами является: (Val1,Val2) IN(SELECT VAL1,val2..

SELECT t.address,(t.x+t.y) as z 
FROM student t 
WHERE (t.x,t.y) IN(SELECT x,y FROM tweet) 

Также можно сделать с помощью объединения:

SELECT t.address,(t.x+t.y) as z 
FROM student t 
JOIN tweet s 
ON(t.x = s.x and t.y = s.y) 

EDIT: Я думаю, что вы хотите:

SELECT s.address,t.x+t.y as z 
FROM student s 
CROSS JOIN tweet t 
+0

Код ошибки: 1054. Неизвестный столбец 'x' in 'field list' –

+0

У вас есть столбец x в ученике таблицы? @ArjunChaudhary – sagi

+0

nope. Я хочу использовать вывод второго запроса как входной для первого. –

0

Попробуйте это:

SELECT s.address, (t.x + t.y) as z 
from (SELECT id,x,y FROM `tweet`) as t, student s 
WHERE t.id = s.id; 
0

Вам нужно зарегистрироваться две таблицы, вычисляя расстояние в предложении ON, чтобы выбрать соседние строки.

SELECT * 
FROM tweetmelbourne 
JOIN roadData 
ON (3959 * acos(cos(radians(latitude)) * cos(radians(geo_coordinates_latitude)) * 
    cos(radians(geo_coordinates_longitude) - radians(longitude)) + sin(radians(latitude)) * 
    sin(radians(geo_coordinates_latitude)))) < .1 

Это будет очень медленно, если таблицы большие. Невозможно использовать индексы для реализации объединения, поэтому ему придется выполнять эту сложную формулу для каждой пары строк. Возможно, вы захотите посмотреть расширения MySQL Spatial Data.

+0

ВЫБРАТЬ geo_coordinates_latitude, geo_coordinates_longitude, (3959 * экоса (соз (радианы (широта)) * Cos (радианы (geo_coordinates_latitude)) * соз (радианы (geo_coordinates_longitude) - радиан (долгота)) + sin (радианы (широта)) * Sin (радиан (geo_coordinates_latitude)))) как расстояние в roadTweets ИЗ tweetmelbourne перекрестного соединения roadData HAVING расстояние <20 ORDER BY расстояние LIMIT 0, 20; –

+0

Я думаю, что это было бы также хорошо. Да, очень медленно. Как пользоваться пространством; данные. Я попробую, а потом спрошу вас, хорошо ли это. –

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