【问题标题】:(my)SQL: Select 20 latest entries in logfile from unique persons(my)SQL:从独特的人中选择日志文件中的 20 个最新条目
【发布时间】:2010-08-24 19:28:01
【问题描述】:

我有一个日志文件,它记录来自各种表的插入/删除/更新。 我想了解例如最近 20 个人的概述,这些人记录了更新的位置,按上次更新日期时间 DESC 排序

我现在拥有的是:

SELECT DISTINCT logfile.idvalue, DATE_FORMAT(logfile.logDateTime,'%d-%m-%Y  %H:%i') AS thedatetime, CONCAT_WS(' ',people.peopleSurname,people.peopleLastname) AS peopleName
FROM logfile,people
WHERE 0=0
AND logfile.tablename='people'
AND logfile.action='update'
AND logfile.idvalue=people.peopleID
GROUP BY logfile.idvalue
ORDER BY logfile.logDateTime DESC,logfile.idvalue DESC

但这会导致 logDateTimes 与最新(最大)“更新条目”的日期时间不对应 我错过了什么?!

谢谢 巴特

【问题讨论】:

    标签: sql mysql


    【解决方案1】:
    SELECT  *
    FROM    logfile lf
    WHERE   tablename = 'people'
            AND action = 'update'
            AND logdatetime = 
            (
            SELECT  MAX(logdatetime)
            FROM    logfile lfi
            WHERE   lfi.idvalue = lf.idvalue
                    AND lfi.tablename = lf.tablename
                    AND lfi.action = lf.action
            )
    ORDER BY
            logdatetime DESC
    LIMIT 20
    

    创建以下索引:

    (tablename, action, idvalue, logdatetime)
    (tablename, action, logdatetime)
    

    让这个工作快速。

    【讨论】:

      【解决方案2】:

      也许这可能有点用......

      SELECT *
          FROM (SELECT MAX(logdatetime) AS latest_time,
                       idvalue          AS idvalue
                    FROM logfile
                    WHERE tablename = 'people' AND
                          action    = 'update'
                    GROUP BY idvalue) AS max_times
          ORDER BY latest_time DESC
          LIMIT 20;
      

      【讨论】:

      • 感谢您的回复 - 第一个解决方案运行良好,并且可能有更多解决方案可以解决这个问题..:-)
      【解决方案3】:

      问题

      如果您在同一查询中选择 logDateTime,您将获得该人更新表格的每个日期时间的结果,即每人多个结果。

      解决方案

      改为使用 MAX 来选择该用户的最新日期时间。您也可以使用别名按 MAX 值排序。

      经过测试和工作的代码(没有子查询!)

      SELECT DISTINCT 
      l.idvalue, 
      CONCAT_WS(' ',p.peopleSurname,p.peopleLastname) AS peopleName,
      DATE_FORMAT(MAX(l.logDateTime),'%d-%m-%Y  %H:%i') as thedatetime
      FROM 
      logfile l INNER JOIN people p ON l.idvalue = p.peopleID
      WHERE
      l.tablename='people' AND l.action='update'
      GROUP BY 
      l.idvalue, p.peopleSurname, p.peopleLastname
      ORDER BY 
      thedatetime DESC, l.idvalue DESC
      LIMIT 0, 20;
      

      我为人员和日志文件使用了表别名,以使其更易于阅读并切换到更常见的连接语法。

      【讨论】:

      • 感谢您的回复 - 第一个解决方案运行良好,并且可能有更多解决方案可以解决这个问题..:-)
      • 如果你想要更好的性能,去掉对子查询的需要会有很大的不同。
      猜你喜欢
      • 2023-01-26
      • 2022-06-13
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 2013-01-12
      • 2013-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多