【问题标题】:Multi column in nested query in select选择中嵌套查询中的多列
【发布时间】:2015-12-09 10:11:25
【问题描述】:

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

【问题讨论】:

  • CALC_DISTANCE 有效吗?可以手动调用吗?
  • 是的工作。这是定义 earth_radius * 2 * ASIN(SQRT( POWER(SIN((mylat - destlat) * pi()/180 / 2), 2) +COS(mylat * pi()/180) * COS(destlat * pi ()/180) * POWER(SIN((mylng -destlng) * pi()/180 / 2), 2) ))

标签: mysql gps subquery city nested-query


【解决方案1】:

我看到了问题。您的子选择构建如下:

(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;

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

【讨论】:

  • 我也想这样做,但我还没有找到方法
  • 什么意思?您没有找到根据城市计算距离的方法吗?
  • 不行,我没有找到办法解决我原帖第二次查询的问题
  • 我想玩一下这个。你能分享一下 city 表的结构,以及一些与之相关的条目,以便我看看如何解决这个问题吗?
  • 你好,我已经修改了初始帖子添加表结构
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
  • 2018-05-08
  • 2013-01-19
  • 1970-01-01
  • 2022-11-03
相关资源
最近更新 更多