我有一张与此类似的表格:
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已被覆盖。
答案 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)
其他方法:
ON UPDATE
中设置
触发器。答案 1 :(得分:0)
尝试:
SELECT *
FROM record
WHERE record.id <> record.ref
答案 2 :(得分:0)
如果我理解正确的话,你能否使用IS NULL?
SELECT *
FROM record
WHERE ref IS NULL
然后你应该得到所有没有引用的记录,等于最新的