Моя база данных (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", поскольку его последняя запись в журнале показывает полный доступ к файлу.