在节点 js mysql 查询中将经纬度和距离作为参数传递
passing longitude and latitude and distance as parameters in node js mysql query
你好,我写了这个很长的 mysql 查询,它以用户经度、纬度和米作为输入,并显示 100 米以内的位置。
但是我总是在附近收到 mysql 错误?当我在浏览器中输入 http://localhost:3002/closest/20.8877387/5.847748474/100
时。有人可以给我提示吗?
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);
});
});
您似乎没有设置 ?
参数的值。您需要将它们作为数组提供给 .query(sqlStatement, parameterArray, callback)
的第二个参数。您的查询中有四个 ?
,因此您提供的数组必须有四个元素。 [lat, lat, lon, radius]
对应你四个 ?
的目的。查询中的 ?
代表条件参数。你要
你的查询是这样的。
SELECT bigFatFormula AS METERS FROM tbl WHERE METERS < someDistance
WHERE 子句不起作用。你不得不说
SELECT * FROM
(SELECT bigFatFormula AS METERS FROM tbl) result
WHERE METERS < someDistance
在您查询的 WHERE 子句中,您的 METERS
别名不在范围内。嵌套查询将其置于范围内。
您的查询包含一堆嵌套的 WHERE 子句。那是行不通的。
你的 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) => {
我还没有调试过这个。
专业提示:如果您的 table 中有很多行,您的查询将非常缓慢。 Read this 征求建议。
专业提示:您可能希望为您的 lat/lng - 到 - 距离函数使用存储函数,以使您的查询更容易被下一个人阅读.这是 stable function.
专业提示:在尝试将它们嵌入程序之前,使用 SQL 客户端程序调试此类复杂查询通常是个好主意。
你好,我写了这个很长的 mysql 查询,它以用户经度、纬度和米作为输入,并显示 100 米以内的位置。
但是我总是在附近收到 mysql 错误?当我在浏览器中输入 http://localhost:3002/closest/20.8877387/5.847748474/100
时。有人可以给我提示吗?
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);
});
});
您似乎没有设置
?
参数的值。您需要将它们作为数组提供给.query(sqlStatement, parameterArray, callback)
的第二个参数。您的查询中有四个?
,因此您提供的数组必须有四个元素。[lat, lat, lon, radius]
对应你四个?
的目的。查询中的?
代表条件参数。你要你的查询是这样的。
SELECT bigFatFormula AS METERS FROM tbl WHERE METERS < someDistance
WHERE 子句不起作用。你不得不说
SELECT * FROM
(SELECT bigFatFormula AS METERS FROM tbl) result
WHERE METERS < someDistance
在您查询的 WHERE 子句中,您的 METERS
别名不在范围内。嵌套查询将其置于范围内。
您的查询包含一堆嵌套的 WHERE 子句。那是行不通的。
你的 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) => {
我还没有调试过这个。
专业提示:如果您的 table 中有很多行,您的查询将非常缓慢。 Read this 征求建议。
专业提示:您可能希望为您的 lat/lng - 到 - 距离函数使用存储函数,以使您的查询更容易被下一个人阅读.这是 stable function.
专业提示:在尝试将它们嵌入程序之前,使用 SQL 客户端程序调试此类复杂查询通常是个好主意。