如何丢弃MySQL表中的旧条目

时间:2012-03-12 12:16:51

标签: mysql

我有一张与此类似的表格:

CREATE TABLE IF NOT EXISTS `record` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `data` int(11) NOT NULL,
  `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `ref` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=245 ;

其中ref是对record表的自引用。 record填充了一些data,有时,record会更新新数据,但我会保留以前record的副本而不做任何修改。因此,当record更新时,实际发生的事情是使用ref创建新行到上一个record。它是record为NULL,除非它替换旧的record

所以我需要的是一个返回所有新记录的mysql查询。我尝试了类似的东西,但它不起作用:

SELECT * 
FROM record, record AS mref
WHERE record.id != mref.ref

示例:

id  |  data  |    date    | ref
--------------------------------
 1  |  32    | 2012-03-12 | NULL
 2  |  33    | 2012-03-12 | NULL
 3  |  34    | 2012-03-12 | NULL
 4  |  37    | 2012-03-12 | 1
 5  |  38    | 2012-03-12 | 2

查询应返回:

id  |  data  |    date    | ref
--------------------------------
 3  |  34    | 2012-03-12 | NULL
 4  |  37    | 2012-03-12 | 1
 5  |  38    | 2012-03-12 | 2

到期1和2已被覆盖。

3 个答案:

答案 0 :(得分:1)

从其他记录中选择所有没有引用它们的记录:

SELECT r.* 
FROM record r
WHERE not exists (SELECT * FROM record r2 where r2.ref = r.id)

SELECT * 
FROM record
WHERE id NOT IN (SELECT ref FROM record)

其他方法:

  1. 递归函数,用于计算具有给定ID的行是否为 最“新鲜”的
  2. 创建另外的布尔字段 行是否是实际的。它可以在ON UPDATE中设置 触发器。

答案 1 :(得分:0)

尝试:


SELECT * 
FROM record
WHERE record.id <> record.ref

答案 2 :(得分:0)

如果我理解正确的话,你能否使用IS NULL?

SELECT *
FROM record
WHERE ref IS NULL

然后你应该得到所有没有引用的记录,等于最新的