我在mysql中查询了这个查询:
set @dist=20;
set @earthRadius=6371;
SELECT *,SPLIT_STR(posizione_GPS,';', 1) as mylat,SPLIT_STR(posizione_GPS,';', 2) as mylon,(SELECT CALC_DISTANCE(mylat,mylon,cit.lat,cit.lng,@earthRadius) as distance FROM city as cit HAVING distance<@dist ORDER BY distance asc LIMIT 1 ) as distance FROM statistiche as stat
有了这个,我得到统计数据,并且鉴于每个统计数据与协调的GPS相关联,我想使用我已经在数据库中的表(城市)获得与其相关联的城市的名称。 要做到这一点,计算坐标之间的距离,并采取较远的城市。
CALC_DISTANCE是一个自定义函数,用于计算两个gps点之间的距离。
查询有效但我需要城市的名称,如果我在子查询中添加第二列,请输入名称:
set @dist=20;
set @earthRadius=6371;
SELECT *,SPLIT_STR(posizione_GPS,';', 1) as mylat,SPLIT_STR(posizione_GPS,';', 2) as mylon,(SELECT nome, CALC_DISTANCE(mylat,mylon,cit.lat,cit.lng,@earthRadius) as distance FROM city as cit HAVING distance<@dist ORDER BY distance asc LIMIT 1 ) as distance FROM statistiche as stat
我收到此错误
Error Code: 1241. Operand should contain 1 column(s)
如何获取城市名称? 感谢
statistiche
表的结构是:
`id` int(11) NOT NULL AUTO_INCREMENT,
`utenti_id` int(11) NOT NULL,
`spots_id` int(11) NOT NULL,
`posizione_GPS` varchar(45) DEFAULT NULL,
`data` date DEFAULT NULL,
`ora` time DEFAULT NULL,
PRIMARY KEY (`id`)
city
表的结构是:
`id` varchar(10) NOT NULL,
`nome` varchar(100) DEFAULT NULL,
`prov` varchar(45) DEFAULT NULL,
`lat` float(10,6) DEFAULT NULL,
`lng` float(10,6) DEFAULT NULL,
PRIMARY KEY (`id`)
答案 0 :(得分:0)
我看到了问题。您的子选择构建如下:
(SELECT nome, CALC_DISTANCE(mylat,mylon,cit.lat,cit.lng,@earthRadius) as distance
FROM city as cit
HAVING distance<@dist
ORDER BY distance asc LIMIT 1 )
as distance
在此子选择中,您选择了两列(nome和CALC_DISTANCE的结果),这是无法完成的。我想你已经知道了,但我没有抓住它。
我会更改您的子查询以仅返回城市。一旦城市可用,您可以重新计算该行的距离。
这可能不是最有效的方式,但这是我能想到的唯一方法。
修改强>
我会重新编写查询以使用JOIN而不是子选择。
set @dist=20;
set @earthRadius=6371;
SELECT * FROM (
SELECT
stat.id as s_id,
posizione_GPS,
SPLIT_STR(posizione_GPS,';', 1) as mylat,
SPLIT_STR(posizione_GPS,';', 2) as mylon,
city.id as c_id,
lat,
lng,
CALC_DISTANCE(SPLIT_STR(posizione_GPS,';', 1), SPLIT_STR(posizione_GPS,';', 2), lat, lng, 6371) as distance
FROM statistiche stat JOIN city
ON CALC_DISTANCE(SPLIT_STR(posizione_GPS,';', 1), SPLIT_STR(posizione_GPS,';', 2), lat, lng, 6371) < @dist
ORDER BY s_id, distance ASC
) A group by s_id;
此查询似乎可以在我创建的测试数据集上正常运行,性能并不比使用子查询差。