使用Group By&返回最新的副本

时间:2011-11-16 13:18:46

标签: php mysql sql

我在表格中有5列id, address, lat, lng, timesetamp,如果两行在latlng列中具有相似的值,则认为该行是重复的。

MySQL查询

SELECT address, lat, lng FROM table GROUP BY lat, lng

问题:我设法让它只返回此查询的唯一行。但是,结果似乎是最早插入数据库的重复行。如何让MySQL返回最新的重复行?比如返回带有最新timestamp

的重复行

3 个答案:

答案 0 :(得分:3)

对于每个纬度/经度组合,这应该得到具有最新时间戳的行,而不管每种组合有多少行。

SELECT
    [what you want to know about the latest row]
FROM
    table t1
    INNER JOIN
    (
        SELECT
            lat,
            long,
            max(timestamp) as latest
        FROM
            table
        GROUP BY
            lat,
            long
     ) as t2
     ON (
         t1.lat=t2.lat AND
         t1.long=t2.long AND
         t1.timestamp=t2.latest
     )

如果您只想要具有重复组合的行,则需要调整子查询以计算GROUPed行并使用HAVING过滤它们。

答案 1 :(得分:2)

尝试此查询

SELECT address, lat, lng FROM table where timestamp in (select max(timestamp) from table GROUP BY lat, lng)

编辑:

这是嵌套查询。子查询将返回最大时间戳,它基于lat和lng字段的组,因此它将返回多个结果,因此您需要使用in()函数。外部查询将根据时间戳检索值,假设有不同lat的多个时间戳,你得到的那些查询将给出所有这些记录。

如果有任何混淆问题

答案 2 :(得分:0)

您可能希望分两步完成此操作。使用

获取包含1个以上记录的列表
HAVING COUNT(*) > 1

然后从该列表中获取具有最新时间戳的第二个记录列表。