如何用Prisma实现按坐标曼哈顿距离排序记录
使用Prisma实现按坐标曼哈顿距离排序
下面提供两种可行的方案来实现你需要的按坐标曼哈顿距离排序的需求:
方案1:直接使用原生SQL查询($queryRaw)
这是最直接对应你给出的SQL语句的方式,适合不需要结合其他Prisma查询构建器逻辑的场景:
import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); async function getLocationsSortedByDistance(userLat: number, userLng: number) { const locations = await prisma.$queryRaw` SELECT * FROM Locations ORDER BY ABS(lat - ${userLat}) + ABS(lng - ${userLng}) ASC `; return locations; }
方案2:结合Prisma查询构建器使用原生排序表达式
如果需要添加过滤、分页等额外查询条件,可以在Prisma的findMany中使用原生排序表达式(要求Prisma版本≥4.16),同时通过参数绑定避免SQL注入:
async function getFilteredLocationsSortedByDistance(userLat: number, userLng: number) { const locations = await prisma.locations.findMany({ // 可根据需求添加where条件,例如: // where: { isActive: true }, // 可添加分页参数: // skip: 0, // take: 10, orderBy: prisma.raw(`ABS(lat - ?) + ABS(lng - ?) ASC`, [userLat, userLng]) }); return locations; }
注意事项
- 如果你的Prisma版本低于4.16,无法在
orderBy中使用原生表达式,建议优先采用方案1。 - 两种方案都自动处理了参数绑定,避免了SQL注入风险,无需手动拼接字符串。
内容的提问来源于stack exchange,提问作者JoeJack1965
相关产品推荐
相关产品推荐

