php - MySQL Select Inner Join(唯一)

标签 php mysql pdo

在我的应用程序中,我有分配给特定类别的车辆。在下面的查询中,我试图选择在特定区域中至少有一辆车辆的所有类别。

下面的代码工作正常,但是如果类中有多个车辆符合位置参数,则结果中会返回该类的多个实例。

我如何构造此查询,以便只返回每个类的一个实例,而不管类中有多少车辆符合参数?

$get_veh = $pdo->prepare("SELECT * FROM tbl_car_class_category JOIN tbl_vehicles ON tbl_vehicles.veh_class_id = tbl_car_class_category.id_class_cat WHERE tbl_vehicles.veh_advanceLng between (:loc_long-:radius/cos(radians(:loc_lat))*69) and (:loc_long+:radius/cos(radians(:loc_lat))*69) and veh_advanceLat between (:loc_lat-(:radius/69)) and (:loc_lat+(:radius/69)) AND veh_status=:veh_status");

$get_veh->bindparam(":veh_status", $veh_status);
$get_veh->bindparam(":loc_lat", $loc_lat);
$get_veh->bindparam(":loc_long", $loc_long);
$get_veh->bindparam(":radius", $radius);

$get_veh->execute();

最佳答案

如果目的是仅返回类别表中的行,我们可以将 JOIN 替换为 EXISTS(相关子查询)

例如:

 SELECT c.*
   FROM tbl_car_class_category c
  WHERE EXISTS
      ( SELECT 1 
          FROM tbl_vehicles v 
         WHERE v.veh_class_id = c.id_class_cat
           AND v.veh_advanceLng 
               BETWEEN (:loc_long-:radius/cos(radians(:loc_lat))*69)
                   AND (:loc_long+:radius/cos(radians(:loc_lat))*69)
           AND v.veh_advanceLat
               BETWEEN (:loc_lat-(:radius/69)) 
                   AND (:loc_lat+(:radius/69))
           AND v.veh_status=:veh_status
      )

如果我们还需要从车辆表中返回一行,我们可以在内联 View 中使用聚合和 JOIN。

 SELECT c.*
      , g.*
   FROM tbl_car_class_category c
   JOIN ( SELECT v.veh_class_id
               , MIN(v.id)    AS   min_id   -- PK or unique identifier    
            FROM tbl_vehicles v 
            AND v.veh_advanceLng 
                BETWEEN (:loc_long-:radius/cos(radians(:loc_lat))*69)
                    AND (:loc_long+:radius/cos(radians(:loc_lat))*69)
            AND v.veh_advanceLat
                BETWEEN (:loc_lat-(:radius/69)) 
                    AND (:loc_lat+(:radius/69))
            AND v.veh_status=:veh_status
          GROUP BY v.veh_class_id 
        ) m
     ON m.veh_class_id = c.id_class_cat
   JOIN tbl_vehicles g
     ON g.id           = m.min_id
    AND g.veh_class_id = m.veh_class_id
  ORDER BY ...

(注意:这假设 id_class_cattbl_car_class_category 中是唯一的)

关于php - MySQL Select Inner Join(唯一),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43018716/

相关文章:

MySQL Workbench 主机不匹配

mysql - 如何获取行的所有字段以及sqrt在MIN中的字段的sqrt

php - 在 foreach 循环外部使用变量

php - 未选择下拉选项

php - 使用 PHP 返回表名

php - 将 rss 数据存储到 mysql 表时的字符集问题

php - 如何正确验证登录请求?

php - Laravel 5 Eloquent : How to group relationship and get rank

mysql - 从mysql表中获取特定行与另一个表值进行比较

php - 优化我的循环以返回而不是执行 10 次查询