【发布时间】:2011-02-22 15:30:05
【问题描述】:
我已经搜索过,但无法找到答案。此处存在其他链接,但它们似乎不相关,因为它们仅引用一个或两个表,一个静态已知的日期,所有记录都相同,或者标记为已解决但没有给出真正的答案。
我有以下表格:
-- list of items
CREATE TABLE `a` (
`a_id` bigint(20) unsigned NOT NULL auto_increment primary key,
`a_name` varchar(255) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=176 DEFAULT CHARSET=utf8;
-- sample data
insert into a(a_id,a_name) values('1','apple');
insert into a(a_id,a_name) values('2','banana');
insert into a(a_id,a_name) values('3','cheese');
insert into a(a_id,a_name) values('4','bucket of lard');
-- places
CREATE TABLE `b` (
`b_id` bigint(20) unsigned NOT NULL auto_increment primary key,
`b_data` varchar(20) not null
)ENGINE=InnoDB AUTO_INCREMENT=629 DEFAULT CHARSET=utf8;
insert into b(b_id,b_data) values('1','floor');
insert into b(b_id,b_data) values('2','counter top');
insert into b(b_id,b_data) values('3','bed');
insert into b(b_id,b_data) values('4','table');
-- item data showing item A is in place B, with extra data.
CREATE TABLE `c` (
`c_id` bigint(20) unsigned NOT NULL auto_increment primary key,
`c_a_id` bigint(20) unsigned NOT NULL,
FOREIGN KEY (c_a_id) REFERENCES a(a_id),
`c_b_id` bigint(20) unsigned NOT NULL,
FOREIGN KEY (c_b_id) REFERENCES b(b_id),
`c_value` decimal(60,2) NOT NULL default '0.00',
`c_when_created` bigint(20) unsigned NOT NULL,
) ENGINE=InnoDB AUTO_INCREMENT=129886 DEFAULT CHARSET=utf8;
-- sample data (by no means complete!)
insert into c(c_id, c_a_id, c_b_id, c_value, c_when_created )
values('1','1','1', '3.14578', UNIX_TIMESTAMP('2011-02-22 03:00:00'));
insert into c(c_id, c_a_id, c_b_id, c_value, c_when_created )
values('2','2','1', '14578', UNIX_TIMESTAMP('2011-02-22 03:00:01'));
insert into c(c_id, c_a_id, c_b_id, c_value, c_when_created )
values('3','3','1', '4578', UNIX_TIMESTAMP('2011-02-22 03:00:02'));
insert into c(c_id, c_a_id, c_b_id, c_value, c_when_created )
values('4','4','2', '578', UNIX_TIMESTAMP('2011-02-22 03:50:03'));
insert into c(c_id, c_a_id, c_b_id, c_value, c_when_created )
values('1','1','4', '78', UNIX_TIMESTAMP('2011-02-22 03:00:00'));
insert into c(c_id, c_a_id, c_b_id, c_value, c_when_created )
values('2','2','3', '8', UNIX_TIMESTAMP('2011-02-22 03:01:01'));
insert into c(c_id, c_a_id, c_b_id, c_value, c_when_created )
values('3','3','2', '3', UNIX_TIMESTAMP('2011-02-22 03:00:42'));
insert into c(c_id, c_a_id, c_b_id, c_value, c_when_created )
values('4','4','1', '31', UNIX_TIMESTAMP('2011-02-22 03:05:03'));
insert into c(c_id, c_a_id, c_b_id, c_value, c_when_created )
values('1','1','1', '77', UNIX_TIMESTAMP('2006-03-27 03:10:00'));
现在的问题是这样的:我想从 'a' 中搜索表 'c' 中的项目作为在表 'b' 中的位置,但只返回由于拥有而没有过期的记录存在引用此数据的较新记录。在我看来,'c' 中列出了 'a' 和 'b' 且最新日期的字段是唯一有效的字段,其余的都是旧的和过时的,并保留用于历史数据跟踪和报告。
如果我在 c 中查找所有内容,则给出以下数据的示例:
insert into c(c_a_id, c_b_id, c_value, c_when_created )
values('1','1', '3.14578', UNIX_TIMESTAMP('2011-02-22 03:00:00'));
insert into c(c_a_id, c_b_id, c_value, c_when_created )
values('2','1', '14578', UNIX_TIMESTAMP('2011-02-22 03:00:01'));
insert into c(c_a_id, c_b_id, c_value, c_when_created )
values('1','1', '4578', UNIX_TIMESTAMP('2011-02-22 03:00:02'));
.. 我希望只得到日期为“2011-02-22 03:00:01”和“2011-02-22 03:00:02”的最后两行作为“2011-02-” 22 03:00:00' 行将被视为“旧”行,因为存在“2011-02-22 03:00:02”行。
IE,如果存在 4 条记录,a_id 等于“1”,并且我在 c 中搜索该记录,期望 b_id 为 2,我只想获取日期最近的一条记录。
以一种很好的方式将引用 a 和 b 的数据添加到 c 是一种乐趣,并将 a 和 b 中的项目数量保持在可管理的水平;但事实证明,要把它找回来非常困难。因为我只想返回系统中没有更新记录的记录。
【问题讨论】:
标签: mysql date versioning row