【发布时间】:2012-01-20 00:30:24
【问题描述】:
我的数据库 (sqlite3) 有两个表,其架构如下:
CREATE TABLE log(d date, usr text, tag text, bytes int);
CREATE TABLE valid(tag text, filesize int);
假设我有以下示例数据:
d | usr | tag | bytes
--------------------------------
2012-01-19 | bob | foo | 990
2012-01-18 | bob | foo | 1000
2012-01-17 | joe | bar | 2000
2012-01-16 | joe | bar | 1800
2012-01-15 | joe | baz | 0
tag | size
-----------
foo | 1000
bar | 2000
我想检索导致用户无法访问有效文件中的所有字节的最新事件列表。在上面的例子中,选择应该产生 2012-01-19 |鲍勃 |富 | 990.
现在,我正在使用两个 select 语句来获取结果。第一个获取每个用户的最新事件,第二个检查是否访问了所有字节。
CREATE VIEW tmp AS
SELECT * FROM log JOIN (SELECT max(d) AS maxd, usr FROM log GROUP BY usr) AS
tmplog ON (tmplog.usr=log.usr and tmplog.maxd=log.d);
SELECT usr,d FROM tmp
WHERE tag IN (SELECT tag FROM valid) AND bytes NOT IN (SELECT size FROM valid);
有没有办法通过一个选择或更有效地做到这一点?
更新:
在上面的示例中,查询不应检索用户“joe”,因为他最近的日志条目显示正在访问的完整文件。
【问题讨论】: