Php MySQL空间查询的纠错逻辑

Php MySQL空间查询的纠错逻辑,php,mysql,stored-procedures,join,procedure,Php,Mysql,Stored Procedures,Join,Procedure,我的主要目标是在MySQL中创建一个过程,根据传递的纬度和经度查询位置。该查询获取传递给过程的特定半径内位置的id、纬度和经度。我还尝试添加一个连接,以查询每个位置的照片的“照片”表 查询部分有效。它需要返回所有不带双精度的位置,以及字符串中的所有照片 GROUP_CONCAT(CONVERT(photos.pid, CHAR(8))) AS photo 添加这段代码后,查询只返回1个结果,并将所有照片id连接到一个字段中,即使它与该位置没有关联。如果我删除这段代码,它将返回每个位置中的1个,

我的主要目标是在MySQL中创建一个过程,根据传递的纬度和经度查询位置。该查询获取传递给过程的特定半径内位置的id、纬度和经度。我还尝试添加一个连接,以查询每个位置的照片的“照片”表

查询部分有效。它需要返回所有不带双精度的位置,以及字符串中的所有照片

GROUP_CONCAT(CONVERT(photos.pid, CHAR(8))) AS photo
添加这段代码后,查询只返回1个结果,并将所有照片id连接到一个字段中,即使它与该位置没有关联。如果我删除这段代码,它将返回每个位置中的1个,但无论哪个位置有1个或多个与其关联的照片,结果都将加倍,因此需要连接照片字段,但我没有正确地执行此操作

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 GROUP_CONCAT(CONVERT(photos.pid, CHAR(8))) AS photo, destination.id, 
destination.latitude, destination.longitude,
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 CROSS JOIN locations origin LEFT 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
创建过程'GEODIST'(在userid int、dist int、olat float、olon float中)读取SQL数据
开始
宣布迈隆加倍;
申报迈拉双倍;
宣布lon1浮动;
宣布lon2浮动;
宣布lat1浮动;
宣布lat2浮动;
设置mylon=olon;
设置mylat=olat;
设置lon1=mylon-dist/abs(cos(弧度(mylat))*69;
设置lon2=mylon+dist/abs(cos(弧度(mylat))*69);
设置lat1=mylat-(dist/69);
设置lat2=mylat+(dist/69);
选择组_CONCAT(CONVERT(photos.pid,CHAR(8))作为照片,destination.id,
destination.latitude,destination.longitude,
3956*2*ASIN(SQRT(功率(SIN)((起点.纬度-终点.纬度)*pi()/180/2),2)
+COS(origin.latitude*pi()/180)*COS(destination.latitude*pi()/180)
*功率(SIN((origin.longitude-destination.longitude)*pi()/180/2,2)))
作为距离位置的距离目标交叉连接位置原点左连接照片在photos.lid=destination.id其中origin.id=userid
和destination.lon1和lon2之间的经度和destination.lation之间的纬度
距离小于距离限值50的距离顺序;
结束

我想象它应该是这样的,但我没有办法测试它

SELECT 
    GROUP_CONCAT( CONVERT( DISTINCT( photos.pid ), CHAR(8) ) ) ) AS photo,
    destination.id, 
    destination.latitude,
    destination.longitude,
    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
CROSS JOIN
    locations origin
LEFT 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
GROUP BY
    destination.id  
ORDER BY
    distance
LIMIT 50;
选择
组_CONCAT(将(DISTINCT(photos.pid)、CHAR(8))转换为照片,
destination.id,
目的地,纬度,
目的地。经度,
3956*2*ASIN(SQRT(功率(SIN)((起点.纬度-终点.纬度)*pi()/180/2),2)
+COS(origin.latitude*pi()/180)*COS(destination.latitude*pi()/180)
*功率(SIN((origin.longitude-destination.longitude)*pi()/180/2,2)))
作为距离
从…起
地点目的地
交叉连接
地点来源
左连接
photos.lid=destination.id上的照片
哪里
origin.id=userid
及
destination.lon1和lon2之间的经度
和目的地。lat1和lat2之间的纬度
距离小于距离的
分组
目的地id
订购人
距离
上限50;

您应该根据目的地id对它们进行分组,并添加distinct。我在何处按目的地添加group BY DESTINCT.id,我似乎找不到正确的位置,我在尝试分组时不断抛出错误,我还将添加distinct,但是GROUP_CONCAT有点问题,因为当我添加GROUP_CONCAT时,它只返回一个结果,所有照片id都集中到一个字段中的字符串中,即使它们彼此没有关联。我应该在保留GROUP_CONCAT的同时添加GROUP BY,还是您可以指定?我真的很感谢你的帮助!我不确定,因为我没有充分使用GROUP_CONCAT,为什么你不把不同的行拉出来,然后分组,给我几分钟时间,我会举个例子,我会尝试一下,然后再报告。谢谢你的帮助,我真的很感激!我确实试过了,但它抛出了一个错误:#1064-您的SQL语法有一个错误;检查与您的MySQL服务器版本对应的手册,了解在第2行使用near'DISTINCT(photos.pid),CHAR(8)))作为photo,destination.id,desti的正确语法如果我使用原始代码并在ORDER BY语句之前添加DISTINCT和GROUP BY destination.id,它抛出一个错误:#1064-您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解使用near“GROUP BY DETINATION.id ORDER BY distance LIMIT 50”的正确语法;END'在第20行,在不使用distinct的情况下尝试它,甚至可能不需要group by DESTINGE.id,也可能无法在其他函数中使用它。在任何情况下,距离查询都可能是一件痛苦的事情,您可能必须在2个过程中完成它。它看起来越来越像我必须在2个过程中完成这项工作,我感谢您的帮助。性能已经受到了很大的影响,我唯一能想到的另一个选择是,我可以使用PHP过滤结果(因为我正在使用PHP),并从结果数组中删除重复项。否则,我必须对每个单独的结果执行单独的查询,这甚至没有任何意义。性能将被破坏。