【问题标题】:MySQL Syntax Of Complex Sub CalculationMySQL 复杂子计算的语法
【发布时间】:2012-05-06 09:03:44
【问题描述】:

使用以下选择,我试图在 PHP 循环遍历每一行时查看每一行,拉出当前位置半径并使用 PROC distance_between 计算每个“事件”到当前位置的距离,然后填充 @987654322 @ 在移动到下一行之前。

我跌倒的地方(大部分都有效)是添加动作

distance_between 52.5960 , -1.9110 ,
GOFL_LOCCGRP_TPEGILOC_TO_POINTCOORDINATES_LATITUDE ,
GOFL_LOCCGRP_TPEGILOC_TO_POINTCOORDINATES_LONGITUDE AS DISTANCEFROMEVENT

我不清楚如何将其加入SELECT 语句的语法,尽管我自己知道它应该可以工作。

SELECT * FROM Current
    WHERE (GOFL_LOCCGRP_TPEGILOC_TO_POINTCOORDINATES_LATITUDE <53.319589001447
    AND
    GOFL_LOCCGRP_TPEGILOC_TO_POINTCOORDINATES_LATITUDE > 51.872410998553
    AND
    GOFL_LOCCGRP_TPEGILOC_TO_POINTCOORDINATES_LONGITUDE > -2.6349916029658
    AND
    GOFL_LOCCGRP_TPEGILOC_TO_POINTCOORDINATES_LONGITUDE < -1.1870083970342
    AND
    VALIDPERIOD_STARTOFPERIOD < '12-05-06 16:15:31'
    AND
    VALIDPERIOD_ENDOFPERIOD > '12-05-06 16:15:31' ,
    distance_between 52.5960 , -1.9110 , GOFL_LOCCGRP_TPEGILOC_TO_POINTCOORDINATES_LATITUDE , GOFL_LOCCGRP_TPEGILOC_TO_POINTCOORDINATES_LONGITUDE AS DISTANCEFROMEVENT )

如果我能得到任何指导,我们将不胜感激。

人族

CREATE FUNCTION distance_between (from_lat DECIMAL(6, 3),
    from_lng DECIMAL(6, 3),
    to_lat DECIMAL(6, 3),
    to_lng DECIMAL(6, 3))
    RETURNS DECIMAL(11, 3)

    RETURN 6371 * 2 * ATAN2(SQRT(POW(SIN(RADIANS(to_lat - from_lat)/2), 2) +
    POW(SIN(RADIANS(to_lng - from_lng)/2), 2) * COS(RADIANS(from_lat)) *
    COS(RADIANS(to_lat))), SQRT(1 - POW(SIN(RADIANS(to_lat - from_lat)/2), 2) +
    POW(SIN(RADIANS(to_lng - from_lng)/2), 2) * COS(RADIANS(from_lat)) * COS(RADIANS(to_lat))));

工作......

SELECT *, ( 3959 * acos( cos( radians(52.5960) ) * cos( radians( GOFL_LOCCGRP_TPEGILOC_TO_POINTCOORDINATES_LATITUDE ) ) * cos( radians( GOFL_LOCCGRP_TPEGILOC_TO_POINTCOORDINATES_LONGITUDE ) - radians(-1.9110) ) + sin( radians(52.5960) ) * sin( radians( GOFL_LOCCGRP_TPEGILOC_TO_POINTCOORDINATES_LATITUDE ) ) ) ) AS DISTANCEFROMEVENT FROM Current HAVING DISTANCEFROMEVENT < 50 ORDER BY DISTANCEFROMEVENT

【问题讨论】:

  • 您想在 SQL 查询中这样做的原因是什么?看来你可以获取数据,用 PHP 处理它,然后继续。
  • 嗨 - 我正在尝试生成一组最终的 SQL 数据以呈现给我拥有的 JSONP 功能。在 xml 版本中,我只是在迭代时运行每一行的计算,然后在我准备好创建文本时呈现它们。由于 JSONP 调用采用 SQL 结果,我需要在单个 SQL 查询中进行所有处理.....
  • 您不能进行计算并将结果存储在传递给 JSONP 调用的字符串/数组/对象中吗?
  • 当你说你的意思是我的距离结果还是 SQL + 距离结果?由于我仍然感觉自己的方式,我试图不让事情过于复杂,因此只关注 SQL 方面,因为 JSONP 在我的其余编码中是一致的。
  • SQL+距离结果。您可以在没有距离的情况下执行 SQL,进行距离计算(在 php 中),然后使用该距离修改结果行,最后将修改后的结果集传递给您的 JSONP 函数。

标签: php mysql select syntax proc


【解决方案1】:

您在给您带来麻烦的部分之前的最后一个搜索词缺少一个结束“'”。除非这只是这里的错字。如果不是这样,请告诉我,我再看看

编辑:

SELECT *, (distance_between 52.5960 , -1.9110 , 
GOFL_LOCCGRP_TPEGILOC_TO_POINTCOORDINATES_LATITUDE , GOFL_LOCCGRP_TPEGILOC_TO_POINTCOORDINATES_LONGITUDE) AS DISTANCEFROMEVENT 
FROM Current WHERE
GOFL_LOCCGRP_TPEGILOC_TO_POINTCOORDINATES_LATITUDE < 53.319589001447
AND GOFL_LOCCGRP_TPEGILOC_TO_POINTCOORDINATES_LATITUDE > 51.872410998553
AND GOFL_LOCCGRP_TPEGILOC_TO_POINTCOORDINATES_LONGITUDE > -2.6349916029658
AND GOFL_LOCCGRP_TPEGILOC_TO_POINTCOORDINATES_LONGITUDE < -1.1870083970342
AND VALIDPERIOD_STARTOFPERIOD < '12-05-06 16:15:31'
AND VALIDPERIOD_ENDOFPERIOD > '12-05-06 16:15:31'

好的,因此您需要调用 SELECT 中的 DISTANCEFROMEVENT 字段以使其出现。

【讨论】:

  • 是的——我认为这是一个复制/粘贴错字,因为我一直在尝试不同的方法——现在应该是正确的。如果感兴趣,也添加了 PHP。
  • 好吧,我现在实际上是在电脑上而不是手机上。我不认为 'distance_between' 是任何类型的 MySQL 命令,它直接出现在您的 WHERE 子句中并且没有任何意义。你只是在php中尝试这个吗?或者您可以通过命令行或工作台直接连接 MySQL 以获取错误号?或者直接在 php 中使用 mysql_query($connect, $sql) 或 die(mysql_errno($connect) . ": " . mysql_error($connect));
  • 嗨 - 在上面添加了 distance_between PROC。 WHERE 要求在调用 sql 之前确定的区域内的任何数据项。大多数人使用 Haversine 论坛在 SQL 代码中执行此操作的地方,我选择了一个直接框,因为它很快,数据将显示在屏幕上。所有这些确实有效,因为我一直在其他地方使用它......(实际上我在 php 中做了大约 5 分钟)......我跌倒的地方是添加 distance_between in 作为子动作,这样我就可以动态计算出每一行距中心位置的距离。
  • 当前用户位置是 $latitude $longitude,您可以在上面的 SQL 查询中看到它是 lat long。像 GOFL_LOCCGRP_TPEGILOC_TO_POINTCOORDINATES_LATITUDE 这样的键也是我自己在数据库中的自定义列。
  • 只是我在上面编辑过的一个简短说明....我提出的最后一个解决方案是只需要调整几件事。非常感谢 Brendon 和 Scarcrow。
猜你喜欢
  • 1970-01-01
  • 2013-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多