select中嵌套查询中的多列

时间:2015-12-09 10:11:26

标签: mysql gps subquery city nested-query

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

1 个答案:

答案 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;

此查询似乎可以在我创建的测试数据集上正常运行,性能并不比使用子查询差。