【发布时间】:2014-07-16 21:36:10
【问题描述】:
我正在创建一个 MySQL 程序。这些表格及其数据由 MAXMIND 的位置 IP 服务提供,可以在here 找到。 PROCEDURE 不是由我创建的,但它完全可以满足我的需要,除非我试图向查询中添加一个 JOIN。我正在尝试获取“目的地”的 id 并查询照片表以获取照片。
表格
| locations || photos |
|________________||________________|
| | | |
| id | | id |
| latitude | | lid |
| longitude | | pid |
守则:
CREATE PROCEDURE `GEODIST`( IN userid int, IN dist int, IN olat float, IN olon float ) DETERMINISTIC READS SQL DATA
BEGIN
DECLARE mylon DOUBLE;
DECLARE mylat DOUBLE;
DECLARE lon1 FLOAT;
DECLARE lon2 FLOAT;
DECLARE lat1 FLOAT;
DECLARE lat2 FLOAT;
SET mylon = olon;
SET mylat = olat;
SET lon1 = mylon - dist / abs( cos( radians( mylat ) ) * 69 );
SET lon2 = mylon + dist / abs( cos( radians( mylat ) ) * 69 );
SET lat1 = mylat - ( dist / 69 );
SET lat2 = mylat + ( dist / 69 );
SELECT destination.id, destination.latitude, destination.longitude, photos.lid,
photos.pid, 3956 * 2 * ASIN(SQRT( POWER(SIN((origin.latitude -destination.latitude) * pi()/180 / 2), 2) +COS(origin.latitude * pi()/180) * COS(destination.latitude * pi()/180) *POWER(SIN((origin.longitude -destination.longitude) * pi()/180 / 2), 2) )) AS distance
FROM locations destination, locations origin JOIN photos ON photos.lid = destination.id WHERE origin.id = userid
AND destination.longitude BETWEEN lon1 AND lon2 AND destination.latitude BETWEEN lat1 and lat2
HAVING distance < dist ORDER BY distance LIMIT 50;
END
问题是,当我调用 PROCEDURE 时,我收到以下错误:
#1054 - Unknown column 'destination.id' in 'on clause'
如果查询中没有 JOIN 子句,一切正常。查询正常工作,所以我知道它与 JOIN 有关,但我不知道发生了什么。非常感谢任何帮助。
【问题讨论】:
-
重做我的评论 - 位置目的地和位置来源之间的关系是什么?交叉加入?
-
@Twelfth 这是一个故意的 CROSS JOIN(交叉自连接),因此您可以获得起点和终点的所有组合以获取所有位置之间的距离......然后过滤掉想要的那些组合。
-
@VMai 这就是我所怀疑的......正在确认,因为他在那里混合了连接语法。嘿,你通过不确认而只是回答来击败我的答案:)
-
要么放弃连接运算符的老式逗号语法并使用
JOIN关键字,或者 - 将连接谓词移动到WHERE子句。不要混合使用老式逗号语法和JOIN .. ON语法。
标签: php mysql performance stored-procedures join