0

我有一个包含下几列的表:ID(PK,AutoIncrement),Line,Line_Cod,Latitude,Longitude,Time(Timestamp Auto)。

每一行都包含某一时刻某条线路的坐标(总线号),但是,我们有不同的总线具有相同的线路号,我们通过它们的线路代码(Line_Cod)来区分它们。

因此,例如,我们可以在表中包含下一行:

表格图像

我要选择的是每辆公共汽车的最后一个位置,由它们的行号标识,但要区分它们的 line_cod。在上面的示例中,如果我查找第 50 行,我想获取 ids 1,3 和 6(不是 2,因为它与 6 是同一条总线,但它是旧记录)。

我知道如何为一行选择最近的一行:

SELECT LINE, LINE_COD, LATITUDE, LONGITUDE, 
CONVERT_TZ( TIME,  '+00:00',  '+07:00' ) AS  'TIME'
FROM LOCATION
WHERE LINE = 50
ORDER BY TIME DESC 
LIMIT 1;

但这只会给我最近的记录,不管 Line_COD ......

我在所有数据库领域都是新手,任何有关如何实现这一目标的帮助都将不胜感激。

4

1 回答 1

1

我没有测试过这个查询,但是,你可以这样做:

SELECT * FROM 
(SELECT LINE, LINE_COD, LATITUDE, LONGITUDE, 
CONVERT_TZ( TIME,  '+00:00',  '+07:00' ) AS  'TIME'
FROM LOCATION
WHERE LINE = 50
ORDER BY TIME DESC) L GROUPBY L.LINE
LIMIT 1;

基本上,您需要按 LINE 对行进行分组以消除重复项。但是,您不能在 MySQL 中的单个查询中进行 groupby 和 orderby,因此您需要先创建一个子查询来按时间选择和排序项目,然后按 LINE 对该表进行分组以消除重复项。

编辑:

您也可以尝试 SELECT DISTINCT。但是,问题在于您无法选择多个字段,否则您的结果将不是唯一的,据我记得当我遇到类似问题时。但是,也许我当时错过了一些东西。

显示结果的所有行,而不是最后一行。另外,我刚刚意识到您想通过 LINE_COD 而不是 LINE 来区分。所以这是最终的查询:

SELECT * FROM 
(SELECT LINE, LINE_COD, LATITUDE, LONGITUDE, 
CONVERT_TZ( TIME,  '+00:00',  '+07:00' ) AS  'TIME'
FROM LOCATION
WHERE LINE = 50
ORDER BY TIME DESC) L GROUPBY L.LINE_COD;
于 2013-06-06T23:13:28.553 回答