MYSQL在指定后选择第一行

时间:2015-02-19 11:28:31

标签: mysql rows

我有车的位置表(来自gps跟踪器),我想选择开始和结束驱动器的位置。所以我应该选择速度> 0的第一行和速度> 0且具有特定日期(日)的最后一行。我怎么能这样做?

例如,我有值的表:

+------+-------+---------------------+
| id   | speed | date                |
+------+-------+---------------------+
|    1 |     0 | 2015-02-03 10:00:00 |
|    2 |    10 | 2015-02-03 10:00:10 |
|    3 |    50 | 2015-02-03 10:00:20 |
|    4 |   100 | 2015-02-03 10:00:30 |
|    5 |    50 | 2015-02-03 10:01:00 |
|    6 |     0 | 2015-02-03 10:01:10 |
|    7 |    10 | 2015-02-03 12:00:10 |
|    8 |    50 | 2015-02-03 12:00:20 |
|    9 |   100 | 2015-02-03 12:00:30 |
|   10 |    50 | 2015-02-03 12:01:00 |
|   11 |     0 | 2015-02-03 12:01:10 |
+------+-------+---------------------+

我需要选择带有ID的记录:2,5,7,11

修改

这是列的完整列表:id(身份),car_id,海拔高度,纬度,经度,速度,日期

我需要计算每个赛道距离。 (一辆车可能在1天内开车多次 - 它可以从早上6点开到上午10点,然后从上午10点到下午1点停车,然后从下午1点到下午5点再次开车。)所以首先我需要&#34 ;检测"开始和停止驾驶(汽车在停车时也将数据发送到数据库(速度= 0)),然后使用类似distance calculations in mysql queries

之类的东西计算距离

这是来自http://www.traccar.org/项目的数据库。

2 个答案:

答案 0 :(得分:0)

如果您的ID随时间增长,那么您可以使用两个子查询(无需使用HAVING):

SELECT * FROM mytable 
WHERE id IN (
   SELECT MIN(id) FROM mytable
   WHERE speed > 0
   GROUP BY DAY(date)
)
OR id IN (
   SELECT MAX(id) FROM mytable
   WHERE speed > 0
   GROUP BY DAY(date)
)

第一个子查询每天选择MIN(id),第二个选择每天MAX(id)。在两种情况下,只有速度> 1的行。返回0。这应该为您提供每天的第一个ID,速度> 0和最后一个。

如果您不想依赖按日期排序的ID,则必须使用HAVING date = MIN(date)代替MIN(id)(同样适用于MAX(id))。

当然,date是一个保留关键字,所以你可能不得不逃避它。

答案 1 :(得分:0)

添加像car_id这样将每条记录与汽车相关联的列更容易了:

+------+--------+-------+---------------------+
| id   | car_id | speed | date                |
+------+--------+-------+---------------------+
|    1 |      1 |     0 | 2015-02-03 10:00:00 |
|    2 |      1 |    10 | 2015-02-03 10:00:10 |
|    3 |      1 |    50 | 2015-02-03 10:00:20 |
|    4 |      1 |   100 | 2015-02-03 10:00:30 |
|    5 |      1 |    50 | 2015-02-03 10:01:00 |
|    6 |      2 |     0 | 2015-02-03 10:01:10 |
|    7 |      2 |    10 | 2015-02-03 12:00:10 |
|    8 |      2 |    50 | 2015-02-03 12:00:20 |
|    9 |      2 |   100 | 2015-02-03 12:00:30 |
|   10 |      2 |    50 | 2015-02-03 12:01:00 |
|   11 |      3 |     0 | 2015-02-03 12:01:10 |
+------+--------+-------+---------------------+

然后,您可以使用以下查询获取所需的行:

SELECT MAX(id) id, car_id, MAX(`date`) `date` FROM <table> 
WHERE speed > 0 
GROUP BY car_id 
ORDER BY speed ASC;

+------+--------+---------------------+
| id   | car_id | date                |
+------+--------+---------------------+
|    5 |      1 | 2015-02-03 10:01:00 |
|   10 |      2 | 2015-02-03 12:01:00 |
+------+--------+---------------------+