#python #mysql #sql
#питон #mysql #sql #python
Вопрос:
Я хочу вычислить расстояние между двумя точками. Для этого для каждой точки в одной таблице я должен вычислить расстояние со всеми другими точками в другой таблице в той же базе данных. Для этого я использую python, но я не могу выполнить два запроса одновременно.
import mysql.connector
from haversine import haversine
cnx = mysql.connector.connect(host='localhost',user='xxxxx',passwd='xxxxxx',db='xxxxxx')
cursor = cnx.cursor()
cursor2 = cnx.cursor()
query = ("select longitude,latitude from roadData limit 5")
cursor.execute(query)
query2=("SELECT geo_coordinates_latitude, geo_coordinates_longitude from tweetmelbourne limit 2")
cursor2.execute(query2)
for (longitude,latitude) in cursor:
print longitude
print latitude
for (geo_coordinates_longitude,geo_coordinates_latitude) in cursor2:
print geo_coordinates_longitude
print geo_coordinates_latitude
cursor.close()
cnx.close()
Но я получаю сообщение об ошибке при выполнении второго запроса
InternalError: найден непрочитанный результат.
Я попробовал buffer=true для курсора, но все та же ошибка. А также эффективно ли делать так или любым другим лучшим способом.
Ответ №1:
Одним из приемов, который вы могли бы использовать здесь, было бы перекрестное объединение двух таблиц вместе:
SELECT t1.longitude,
t1.latitude,
t2.geo_coordinates_latitude,
t2.geo_coordinates_longitude
FROM
(
SELECT longitude, latitude
FROM roadData
LIMIT 5
) t1
CROSS JOIN
(
SELECT geo_coordinates_latitude, geo_coordinates_longitude
FROM tweetmelbourne
LIMIT 2
) t2
Это должно сработать, потому что способ, которым вы перебираете результирующий набор в вашем коде Python, напоминает перекрестное соединение. В этом случае, используя приведенный выше запрос, вам нужно будет выполнить итерацию только один раз по всему набору результатов.
Комментарии:
1. Привет, Тим, я понимаю, что ты говоришь, но у меня 4 Гб данных, поэтому перекрестное объединение не выгодно и происходит медленно. Если я могу выполнять по строкам, я могу сохранять результат при запуске. Для перекрестного соединения сначала вам нужно сопоставить, а затем он будет вычислен.
2. Метод, используемый для соединения двух таблиц в SQL, — это соединение (ну, также объединение, но здесь не сработает). Если вы не можете присоединиться, и ваш текущий метод не будет работать, то какие варианты у вас остались?
3. Я хочу получить данные по строкам, а затем выполнить перекрестное соединение по строкам со всеми записями другой таблицы и фильтрацию на основе хранилища условий расстояния в другой таблице.