0

我在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`)
4

1 回答 1

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

在此子选择中,您选择了两列(名称和 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;

此查询似乎在我创建的测试数据集上正常工作,并且性能并不比使用子查询差多少。

于 2015-12-09T15:39:47.820 回答