在nodejs-mysql查询中传递经度、纬度和距离作为参数



Hello我写了一个长的mysql查询,它以用户的经度、纬度和米为输入,并显示100米内的位置。然而,我总是在附近得到一个mysql错误?当我在浏览器中键入CCD_ 1时。有人能给我一个提示吗?

app.get('/closest/:lat/:lon/meters', (request, response) => {
const lat = request.params.lat;
const lon = request.params.lon;
pool.query('SELECT *, ( ( ( Acos(Sin((  WHERE lat =? * Pi() / 180 )) * Sin((  map.lat* Pi() / 180 )) + Cos (( WHERE lat =? * Pi() / 180 )) * Cos(( map.lat* Pi() / 180 )) *  Cos  ((    (  WHERE lon = ? - map.lon ) * Pi() / 180 ))) ) *  180 / Pi  ()   ) * 60 * 1.1515 * 1.609344 * 1000 ) AS `METERS` FROM   base.map WHERE  "METERS" <= ?',lat,lon, (error, result) => {
if (error) throw error;

response.send(result);
});
});
  1. 您似乎没有设置?参数的值。您需要将它们作为数组提供,作为.query(sqlStatement, parameterArray, callback)的第二个参数。查询中有四个?,因此您提供的数组必须有四个元素。[lat, lat, lon, radius]对应于四个?的目的。查询中的?表示条件参数。你想要

  2. 您的查询内容如下。

SELECT bigFatFormula AS METERS FROM tbl WHERE METERS  < someDistance

WHERE子句不起作用。你必须说

SELECT * FROM
(SELECT bigFatFormula AS METERS FROM tbl) result
WHERE METERS < someDistance

在查询的WHERE子句中,METERS别名不在作用域中。嵌套查询将其置于作用域中。

  1. 您的查询包含一堆嵌套的WHERE子句。这行不通。

  2. get处理程序的第一行需要说明这一点,在meters上使用冒号。

app.get('/closest/:lat/:lon/:meters', (request, response) => {

所以,你想要这样的东西。

const lat = Number(request.params.lat);
const lon = Number(request.params.lon);
const radius = Number(request.params.meters);
var q = '
SELECT * FROM (
SELECT *, ( ( ( Acos(Sin(( ? * Pi() / 180 )) 
* Sin((  map.lat* Pi() / 180 ))
+ Cos (( lat =? * Pi() / 180 )) *
Cos(( map.lat* Pi() / 180 )) *
Cos  (((   ? - map.lon ) * Pi() / 180 ))) )
* 180 / Pi  ()   ) * 60 * 1.1515 * 1.609344 * 1000 ) 
AS METERS 
FROM   base.map
) resultset WHERE METERS <= ?';
pool.query(q, [lat, lat, lon, radius], (error, result) => {

我还没有调试过这个。

专业提示:如果表中有很多行,那么查询速度会非常慢。请阅读本文以获取建议。

Pro提示:您可能希望使用一个存储函数作为lat/lng-to-distance函数,以使您的查询更容易为下一个人阅读。这是一个稳定的函数。

专业提示:在尝试将复杂查询嵌入程序之前,通常最好使用SQL客户端程序调试此类查询。

最新更新