我在MySQL上构建PHP应用程序,该应用程序应该接收坐标数组,并且应该从表格周围的地方返回。
我的方法是计算点周围的矩形,所以我有N,S,W,E限制坐标。这不是一个问题,但有很多重复的东西,我必须以某种方式删除。 所以我想到了make fet的数组并将它们从查询中排除。
$fetchedIds =[];
foreach($json->points as $point){
$Pqb = $em->getRepository('MyBundle:Places')->createQueryBuilder('p');
$query = $Pqb->where(
$Pqb->expr()->between(
'p.latitude',':NB',':SB'
)
)
->andWhere(
$Pqb->expr()->between(
'p.longitude',':WB',':EB'
)
)
->andWhere(
$Pqb->expr()->notIn(
'p.id',':fetchedIds'
)
)
->setParameter('NB', $point[1])
->setParameter('SB', $point[0])
->setParameter('WB', $point[3])
->setParameter('EB', $point[2])
->setParameter('fetchedIds', $fetchedIds)
->getQuery();
foreach ($query->execute() as $place) {
$fetchedIds[] = $place->getId();
}
}
Thing is notIn使得这个查询得不到任何结果,即使它是空数组。
我错过了什么,我不知道是什么。 你还可以采用另一种更快的方法吗?
//编辑1:
好吧,这个速度在10k字段中需要大约36ms,但我仍然认为这可能会更快,以某种其他方式。$POSqb = $em->getRepository('MyBundle:places')->createQueryBuilder('pos');
$or = $POSqb->expr()->orX();
foreach($json->points as $point){
$or->add(
$POSqb->expr()->andX(
$POSqb->expr()->between(
'pos.latitude',$point[1],$point[0]
),
$POSqb->expr()->between(
'pos.longitude',$point[3],$point[2]
)
)
);
}
$query = $POSqb->where($or)->getQuery();