【发布时间】:2014-07-13 05:04:16
【问题描述】:
这是我的桌子:
CREATE TABLE component
(id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT UNIQUE);
CREATE TABLE file
(id INTEGER PRIMARY KEY AUTOINCREMENT,
component_id INTEGER,
name TEXT UNIQUE);
CREATE TABLE function
(id INTEGER PRIMARY KEY AUTOINCREMENT,
file_id INTEGER,
name TEXT,
FOREIGN KEY(file_id) REFERENCES file(id),
UNIQUE(file_id, name));
CREATE TABLE version
(id INTEGER PRIMARY KEY AUTOINCREMENT,
version TEXT UNIQUE);
CREATE TABLE data
(id INTEGER PRIMARY KEY AUTOINCREMENT,
file_id INTEGER,
version_id INTEGER,
function_id INTEGER,
errors INTEGER,
...,
FOREIGN KEY(file_id) REFERENCES file(id),
FOREIGN KEY(version_id) REFERENCES version(id),
FOREIGN KEY(function_id) REFERENCES function(id),
UNIQUE(file_id, version_id, function_id));
我需要两个查询:
- 对文件中所有数据的 data.errors 求和。对于给定的文件 ID,我需要所有错误的总和。
- 对特定组件内所有文件的所有函数的 data.errors 求和。
- 所有 data.errors 必须属于最新的 version_id。
上述版本 MAX 要求示例:
DATA
id file_id version_id function_id errors
1 1 3 1 40
2 1 3 2 231
3 1 2 3 19
这里我需要它返回 ids 1,2 并忽略 3,即使它是特定功能的最新版本。它确实与属于该文件的函数的最新版本相匹配。想象一个现实世界的场景,其中一个函数从新版本的文件中删除。
唯一的要求是查询尽可能快。 数据库中的约束没有太大变化(最好什么都没有)。 如果可以在我打算使用它的 Django ORM 中做到这一点,那就太好了,但不是必需的。
【问题讨论】:
标签: sql sqlite group-by sum django-orm