Два запроса выбора за раз python

#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. Я хочу получить данные по строкам, а затем выполнить перекрестное соединение по строкам со всеми записями другой таблицы и фильтрацию на основе хранилища условий расстояния в другой таблице.