2014-10-28 157 views
1

我期待从我的数据库获得每个驱动程序的最近10个位置(authentication_id)。但必须编写两个单独的查询,后者使用前者的结果集。我怎么能把它写成单个查询?mySql优化查询

SELECT DISTINCT authentication_id FROM gps_trak WHERE DATE(location_timestamp) = DATE(NOW()) 

循环的结果集为每个$ AUTHID ...

SELECT latitude, longitude FROM gps_trak WHERE authentication_id = ".$authID." ORDER BY location_timestamp DESC LIMIT 10"; 

这可能吗?

回答

2

你可以把查询的查询中。这就是所谓的 'subquery'

例如

SELECT latitude, longitude 
FROM gps_trak 
WHERE authentication_id 
IN (
    SELECT DISTINCT authentication_id 
    FROM gps_trak 
    WHERE DATE(location_timestamp) = DATE(NOW()) 
) 
ORDER BY location_timestamp DESC LIMIT 10"; 

性能优化

而且你的问题还暗示有关性能(优化)。如果这是一个问题,您可以尝试在您尝试过滤的列上放置索引(在WHERE语句中使用的列)。有很多方法可以优化性能。这一个(索引)和重写你的查询是提高性能的最好方法。更多关于性能:http://www.infoworld.com/article/2616674/database-administration/10-essential-performance-tips-for-mysql.html

0

尝试这样的:

SELECT latitude, longitude FROM gps_trak WHERE authentication_id IN (
    SELECT DISTINCT authentication_id FROM gps_trak 
    WHERE DATE(location_timestamp) = DATE(NOW()) 
) ORDER BY location_timestamp DESC LIMIT 10"; 
0

这里有一个相关子查询的版本(未经测试)...

SELECT DISTINCT x.authentication_id 
      FROM gps_trak x 
      JOIN 
       (SELECT latitude 
       , longitude 
      FROM gps_trak 
      WHERE authentication_id = x.authentication_id 
      ORDER 
      BY location_timestamp DESC LIMIT 10 
      ) y 
      WHERE x.location_timestamp BETWEEN CONCAT(CURDATE(),' 00:00:00') AND CONCAT(CURDATE(),' 23:59:59');