mysql - 改进 MySQL 联合语句

标签 mysql join union

我有以下 mySql 语句,我确信它可以变得更有效率,我只是不确定什么是最好的方法...唯一的区别是在 WHERE 子句中更改的 equip_id...

==============

 (SELECT 
        `receipt_ts`, 
        `driver_id`,
        `equip_id`, 
        `pos_lon`, 
        `pos_lat`, 
        `pos_timestamp`  
   FROM `log_messaging` 
  WHERE `equip_id`='207' AND `tran_type`='T.2.12.0' 
  ORDER BY receipt_ts DESC LIMIT 1 ) 

 UNION  

(SELECT 
       `receipt_ts`, 
       `driver_id`, 
       `equip_id`, 
       `pos_lon`, 
       `pos_lat`, 
       `pos_timestamp`  
  FROM `log_messaging` 
 WHERE `equip_id`='212' AND `tran_type`='T.2.12.0' 
 ORDER BY receipt_ts DESC LIMIT 1 ) 

 UNION

  (SELECT 
         `receipt_ts`, 
         `driver_id`, 
         `equip_id`, 
         `pos_lon`, 
         `pos_lat`, 
         `pos_timestamp`  
    FROM `log_messaging`
   WHERE `equip_id`='213' AND `tran_type`='T.2.12.0' 
   ORDER BY receipt_ts DESC LIMIT 1 );

================

我正在联合每个返回的行来为多个 equip_id 构建一个 max(receipt_ts) 的数据集。 (我需要获取设备的最新定位。

有时查询最终会针对 100 多个唯一的 equip_id。

我正在尝试使查询执行得比现在更快(如上约 100 个 UNIONS 大约 7 秒...

给我指明正确的方向??

谢谢!

最佳答案

我会使用 IN 子句:

SELECT receipt_ts, driver_id, equip_id, pos_lon, pos_lat, pos_timestamp 
FROM log_messaging a
JOIN (SELECT c.equip_id, max(c.receipt_ts) as receipt
      FROM log_messaging c
      WHERE equip_id in ('207', '212', '213')
        AND tran_type='T.2.12.0'
      GROUP by c.equip_id) b USING(equip_id)
WHERE b.receipt = a.receipt_ts
ORDER BY a.receipt_ts

请注意,如果您真的想使用 UNION(我不明白您为什么要这样做)但又想优化它,您可以使用 UNION ALL会更高效,因为 UNION 检查数据以删除重复项,这会消耗更多进程。

关于mysql - 改进 MySQL 联合语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28845778/

相关文章:

sql - 如何检查一个表是否为空,如果是,则检查另一个表?

mysql - 在 BigQuery 中 UNION ALL 或 CONCATENATE 数据集

php - 多个条件匹配的语法错误

Mysql:在列中计数(带连接)

tsql : Access query to TSQL union update conversion correct?

mysql - MySQL 中与 timediff 语句联合

PHP:如何获得星期几?

mysql - 从 "in"函数 : 计算不同的答案值

php - 如何在不同的表中查看页面是否处于事件状态?

MYSQL 慢 ORDER BY