我有以下查询,我正在使用Python脚本执行(通过使用MySQLdb模块)。
conn=MySQLdb.connect (host = "localhost", user = "root",passwd = "<password>",db = "test")
cursor = conn.cursor ()
preamble='set @radius=%s; set @o_lat=%s; set @o_lon=%s; '%(radius,latitude,longitude)
query='SELECT *, (6371*1000 * acos(cos(radians(@o_lat)) * cos(radians(lat)) * cos(radians(lon) - radians(@o_lon)) + sin(radians(@o_lat)) * sin(radians(lat))) as distance FROM poi_table HAVING distance < @radius ORDER BY distance ASC LIMIT 0, 50)'
complete_query=preamble+query
results=cursor.execute (complete_query)
print results
半径,纬度和经度的值并不重要,但是在脚本执行时会定义它们。困扰我的是上面的代码片段没有返回任何结果;本质上意味着查询的执行方式是不可靠的。我执行了SQL查询(包括带有实际值的set变量,并返回了正确的结果数)。
如果我将查询修改为一个简单的SELECT FROM查询(SELECT * FROM poi_table
),它将返回结果。这是怎么回事?
编辑:在括号内计算封装的Haversine公式
答案 0 :(得分:3)
AFAIK您无法使用execute()
运行多个语句
但是,您可以让MySQLdb处理值替换。
请注意,有两个参数传递给execute()
此外,仅运行execute()
实际上并不会返回任何结果
您需要使用fetchone()
或fetchmany()
或fetchall()
。
cursor.execute('''
SELECT *,
6371*1000 * acos(cos(radians(%s)) *
cos(radians(lat)) * cos(radians(lon) - radians(%s)) +
sin(radians(%s)) * sin(radians(lat))) as distance
FROM
poi_table
WHERE distance < %s
ORDER BY distance ASC
LIMIT 0, 50''', (latitude, longitude, latitude, radius,))
results = cursor.fetchall()
print results
答案 1 :(得分:2)
您确定HAVING子句不应该是WHERE distance < @radius
吗?