我有两个表data_old
和data_new
,两者都构造成
CREATE TABLE data(
id TEXT,
subject TEXT,
created INT,
misc1 TEXT,
misc2 TEXT,
misc3 TEXT
);
created
是在UNIX时间。
填充data_new
时,我想比较两者。 data_new
使data_old
无效并在处理后将其替换,但我的最终目标是确定a)废弃的行数和b)data_old
中缺少的行数data_new
这两个表在每个subject
的个别时间范围内相交。
因此,例如,表格是
data_new data_old
id subject created m1 m2 m3 id subject created m1 m2 m3
sd dogs 10 a b c
hd cars 12 s x f
ht houses 9 a l a ht houses 9 a l a
up fruit 7 n o r up fruit 7 n o r
fr cars 7 x y z fr cars 7 b r a
dw fruit 3 n a d
gf dogs 2 z a b
as dogs 1 f i o as dogs 1 a r g
xs fruit 1 u r s
ax cars 0 g u b
我的第一个需要是确定在各自的主题中,ID ax,xs和dw已经过时,即使是在dw之前创建的。 (主题是不同的,因此,如果dw"消失了,或者已经过时了,那么它是不确定的。)所以结果应该是:
dw fruit 3 n a d
xs fruit 1 u r s
ax cars 0 g u b
如果我已识别并处理了这些内容,则可以从data_old
删除它们,如果这样可以简化过程。
然后,我想确定gf 应出现在data_new中,因为subject
中的data_new
上的旧数据存在于gf dogs 2 z a b
中。在这里,查询的结果应该是
{{1}}
在任何一种情况下,结果的顺序都无关紧要。
谢谢!
答案 0 :(得分:0)
我不小心偶然发现了答案。有人可以请理智 - 检查一下吗?
$this->input->get();
如果它做了我想做的事情,这简直太简单了,至少对于测试集而言似乎是这样。
来源:https://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/
答案 1 :(得分:0)
获取所有旧行,其ID不会出现在新表中,并且存在具有相同主题和较小时间戳的新行:
SELECT *
FROM data_old
WHERE id NOT IN (SELECT id FROM data_new)
AND EXISTS (SELECT *
FROM data_new
WHERE data_new.subject = data_old.subject
AND data_new.created < data_old.created);
对于另一个,用NOT EXISTS替换EXISTS。