Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(my)SQL:从unique persons中选择日志文件中的20个最新条目_Sql_Mysql - Fatal编程技术网

(my)SQL:从unique persons中选择日志文件中的20个最新条目

(my)SQL:从unique persons中选择日志文件中的20个最新条目,sql,mysql,Sql,Mysql,我有一个日志文件,它记录各种表的插入/删除/更新。 例如,我想了解最近20个人的概况,他们记录了更新的位置,按上次更新日期时间描述排序 我现在得到的是: SELECT DISTINCT logfile.idvalue, DATE_FORMAT(logfile.logDateTime,'%d-%m-%Y %H:%i') AS thedatetime, CONCAT_WS(' ',people.peopleSurname,people.peopleLastname) AS peopleName F

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

我现在得到的是:

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与最新(最大)“更新条目”的日期时间不对应 我错过了什么

谢谢 巴特

创建以下索引:

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

让它快速工作。

也许这会有一些用处

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;

问题

如果在同一个查询中选择logDateTime,则每次此人更新表时都会得到结果,即每人有多个结果

解决方案

而是使用MAX为该用户选择最新的日期时间。您也可以使用别名按最大值订购

测试和工作代码(无子查询!)


我使用了table a alias for people和logfile,使其更易于阅读,并切换到更常见的联接语法。

感谢您的回答-第一个解决方案效果很好,可能有更多解决方案解决此问题…:)感谢您的回答-第一个解决方案很好,可能有更多解决方案解决此问题…-)如果如果希望获得更好的性能,则不需要子查询将产生很大的不同。
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;
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;