2相同查询数据库返回不同的结果

时间:2014-08-20 16:25:26

标签: php mysql sql yii2

我正在使用Yii2 ActiveRecord& ActiveQuery从数据库中检索数据,但我面临不同的结果:

    $ne_lat = 53.42712825923;
    $sw_lat = 53.39008549731;
    $ne_lon = -2.1651649475098;
    $sw_lon = -2.288761138916;

    $poi = Point::find()

        ->andWhere('latitude <= :ne_lat', [':ne_lat' => $ne_lat])
        ->andWhere('latitude >= :sw_lat', [':sw_lat' => $sw_lat])
        ->andWhere('longitude <= :ne_lon', [':ne_lon' => $ne_lon])
        ->andWhere('longitude >= :sw_lon', [':sw_lon' => $sw_lon])
        ->andWhere(['status' => 1])
        ->asArray()
        ->all();

返回0一个空数组。但是同样的查询只是有点不同的方式:

   $poi = Point::findBySql('SELECT * 
      FROM `point` 
      WHERE (((((latitude <= 53.42712825923) 
      AND (latitude >= 53.39008549731)) 
      AND (longitude <= -2.1651649475098)) 
      AND (longitude >= -2.288761138916)) 
      AND (`status`=1))
   ')->asArray()->all();

返回30多个结果。 结果如下:

id,          name,         latitude,         longitude
1 ,        point1,       53.3917409,        -2.1684337    
2 ,        point2,       53.4135577,        -2.1673014    
3 ,        point3,       53.3991094,        -2.2513453    

看起来绑定浮点数有问题,因为

  $sql = "
        SELECT *
        FROM point
        WHERE latitude <= :ne_lat
          AND latitude >= :sw_lat
          AND longitude <= :ne_lon
          AND longitude >= :sw_lon
          AND status=1
    ";

    $poi = Fitter::findBySql($sql, [':ne_lat' => $ne_lat, ':sw_lat' => $sw_lat, ':ne_lon' => $ne_lon, ':sw_lon' => $sw_lon])->asArray()->all();

也不会返回任何记录

有人知道为什么吗?

3 个答案:

答案 0 :(得分:1)

$ sw_lon = 2.288761138916; <--这在第一个查询中是正面的,而在第二个查询中它是负数(-2.288761138916)。

答案 1 :(得分:0)

如果我没错,使用find()方法将返回此查询语句。

SELECT *       来自point       在哪里(atitude&lt; = 53.42712825923)       AND(纬度&gt; = 53.39008549731)       AND(经度&lt; = -2.1651649475098)       AND(经度&gt; = -2.288761138916)       AND(status = 1)

而不是

SELECT *       来自point       WHERE(((((纬度&lt; = 53.42712825923)       AND(纬度&gt; = 53.39008549731))       AND(经度&lt; = -2.1651649475098))       AND(经度&gt; = -2.288761138916))       AND(status = 1))

sql语句的差异可能是原因。

答案 2 :(得分:0)

你可以试试&#39; status = 1&#39;而不是&#39; status&#39; =&GT;第一个查询构建器中的1。