【问题标题】:Select multiple unique lines in MySQL在 MySQL 中选择多个唯一行
【发布时间】:2010-05-20 14:34:04
【问题描述】:

我有一个包含以下列的表格:

ID、sysid、x、y、z、接收时间

ID 是每一行的唯一编号。

sysid 是特定设备的 ID 号(大约有 100 种不同)

x、y 和 z 是从设备接收到的数据。 (完全随机数)

timereceived 是接收数据的时间戳。

我需要一个 SQL 查询来显示设备 a、设备 b、设备 c 等的最后插入的行。

我一直在玩很多不同的 Select 语句,但从来没有得到任何有效的方法。我设法通过使用 group by 来获得唯一的行,但其余信息是随机的(或者至少感觉非常随机)。

谁能帮帮我?

此表中可能有数十万条记录。

【问题讨论】:

  • 同一主题的后续问题;如何重写我必须能够在视图中使用它的答案?就像现在一样,子查询使 MySQL 抛出 #1349 - View 的 SELECT 在 FROM 子句中包含子查询错误。

标签: sql mysql select


【解决方案1】:
    SELECT id, sysid, x, y, z, timereceived
      FROM tbl
INNER JOIN (  SELECT sysid, max(timereceived) as "timereceived"
                FROM tbl
            GROUP BY sysid ) most_recent
     USING (sysid, timereceived)

这将为您提供完整的行,其中 timereceived 是每个 sysid 的最新行。

【讨论】:

    【解决方案2】:
    SELECT sysid, MAX(timereceived) FROM yourtable GROUP BY sysid
    

    不确定速度,因为我没有大桌子来测试它。确保在 sysid 和 timereceived 上有一个索引,这会有所帮助。对您的每台设备进行查询实际上可能会更快。

    【讨论】:

    • 有了这个,我得到一个带有最新时间戳的每个 sysid 的一行,但没有其他信息。
    【解决方案3】:
    SELECT ID, sysid, x, y, z, MAX(timereceived) as max_time FROM `table` GROUP BY sysid
    

    更新:

    SELECT t1.ID, t1.sysid, t1.x, t1.y, t1.z, t1.timereceived 
        FROM `table` as t1
        JOIN (
          SELECT sysid, MAX(timereceived) as max_time
          FROM `table`
          GROUP BY sysid
        ) AS t2 ON (t2.sysid = t1.sysid AND t2.max_time = t1.timereceived)
    

    【讨论】:

    • 这正是我到目前为止一直在做的事情,起初我认为它正在工作,但唯一来自每个 sysid 的最新行的是时间戳。其他数据感觉完全随机,没有逻辑(但我确信有一些逻辑,因为它每次都是相同的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    相关资源
    最近更新 更多