我目前正在执行清理任务,并希望从 mysql 表中获取数据的历史,结构如下。 最新数据的 ID 为 #5 和 #9。
当前表
ID Employee_ID topic date_attended
1 7890-1 English 2012-03-24
2 7890-1 English 2013-04-21
3 7890-1 English 2014-02-23
4 7890-1 English 2015-03-22
5 7890-1 English 2016-03-21
6 7890-1 method 2012-04-11
7 7890-1 method 2013-05-02
8 7890-1 method 2014-07-03
9 7890-1 method 2016-09-20
我设法使用以下查询获取最新记录,但这是一个非常大的数据(7000 行(,我花了 30 多秒来执行它并获取每个Employee_ID
的结果并添加了一个ini_set
所以我不会得到超时错误。
$sql = " SELECT *
FROM `training_database`
WHERE ID in (
SELECT MAX(ID)
FROM `training_database`
WHERE `employee_id` = '$id'
GROUP BY topic
)
order by ID ASC
";
输出
只是一个例子,但我每个employee_ID和主题平均有 12 行
ID Employee_ID topic date_attended
5 7890-1 english 2016-03-21
9 7890-1 method 2016-09-20
现在我想获取所有旧记录并使用insert
然后将其传输到表中,然后delete
查询,但看起来这将是一项很长的任务,我想知道是否有另一种方法可以优化此过程以使其更快"以某种方式",任何建议都会很棒!
假设ID
是training_database
的PRIMARY KEY
:
SELECT t.*
FROM
( SELECT MAX(ID) AS max_id
FROM `training_database`
WHERE `employee_id` = '$id'
GROUP BY topic
) AS s
JOIN `training_database` AS t ON t.ID = s.max_id
并具有以下复合索引:
INDEX(employee_id, topic, ID)
如果ID
不是PK,让我们看看SHOW CREATE TABLE training_database
和EXPLAIN SELECT ...
。
这是一个"分组最大"问题。 这是一个不能很好地扩展的粗糙解决方案。 更先进的解决方案:http://mysql.rjweb.org/doc.php/groupwise_max