【发布时间】:2018-10-23 21:25:34
【问题描述】:
我有一个包含事件的数据库表。每个事件都有一个位置(纬度和经度)。我正在编写一个 API,以便可以使用 Google Maps API 在地图上显示它们。我只想在地图当前指向的范围内显示记录。所以,我得到了地图的边界并将它们传递给 api。
var sql = `
SELECT *
FROM event e
WHERE 1=1
`;
if(opts.status){
sql += `AND e.status = '${opts.status}'`
}
if(opts.north){
sql += `
AND e.latitude IS NOT NULL
AND e.latitude < ${opts.north}
`
}
if(opts.south){
sql += `
AND e.latitude IS NOT NULL
AND e.latitude > ${opts.south}
`
}
if(opts.west){
sql += `
AND e.longitude IS NOT NULL
AND e.longitude > ${opts.west}
`
}
if(opts.east){
sql += `
AND e.longitude IS NOT NULL
AND e.longitude < ${opts.east}
`
}
这种方法效果很好,除非地图跨越 180° 线。然后我得到 0 个结果。这是在这种情况下生成的 SQL:
SELECT *
FROM event e
WHERE 1=1
AND e.status = 'approved'
AND e.latitude IS NOT NULL
AND e.latitude < 66.00592309328745
AND e.latitude IS NOT NULL
AND e.latitude > -16.496223071414896
AND e.longitude IS NOT NULL
AND e.longitude > 170.34568706699213
AND e.longitude IS NOT NULL
AND e.longitude < -46.216812933007816
我的问题是,我该如何处理才能给我准确的结果?
【问题讨论】:
-
为值添加条件并在需要时将
and切换为or(括号放置正确)?顺便说一句,如果您有纬度/经度的下限和上限,那么您重复了e.latitude/longitude IS NOT NULL -
我只是无法理解那些 AND 和 OR 语句应该是什么样子的逻辑。
-
没那么难,现在你的条件是
e.longitude > 170.34568706699213 AND e.longitude < -46.216812933007816,你能找到满足170 < x < -46的x吗?
标签: javascript node.js sqlite