从 table 计算多个列值
Count mutiple column values from table
这是一个简单的 table,看起来像这样:
id TEXT,
name TEXT,
FOREIGN KEY(id) REFERENCES users(id) ON DELETE CASCADE,
PRIMARY KEY(id, name)
我想要的是能够获得一组行,其中包含 table 中所有名称的计数。基本上每个名字在 table.
中出现了多少次
到目前为止,这是我的代码并且有效:
var names = ['upload_files', 'create_users', 'remove_users', 'edit_tags'];
var query = 'SELECT COUNT(p.id) AS count FROM perms p JOIN users u ON p.id = u.id WHERE p.name = ?',
for(let name of names){
this.db.prepare(query).all([name]).map(value => data[name] = value.count);
}
它产生这样的东西:
upload_files: 5,
create_users: 2,
remove_users: 2,
edit_tags: 5,
假设 upload_files
有 5 行,remove_users
有 2 行,依此类推...
但是当我有 50K 条记录时,它非常慢,每个查询需要 2 秒。
可以合并到一个查询中吗?这样我就可以将所有名称的时间减少到 2 秒
使用 IN
过滤名称并按名称分组。
SELECT p.name,
count(p.id) count
FROM perms p
WHERE p.name IN ('upload_files',
'create_users',
'remove_users',
'edit_tags')
GROUP BY p.name;
并考虑尝试 name
上的索引是否可以加快速度。
这是一个简单的 table,看起来像这样:
id TEXT,
name TEXT,
FOREIGN KEY(id) REFERENCES users(id) ON DELETE CASCADE,
PRIMARY KEY(id, name)
我想要的是能够获得一组行,其中包含 table 中所有名称的计数。基本上每个名字在 table.
中出现了多少次到目前为止,这是我的代码并且有效:
var names = ['upload_files', 'create_users', 'remove_users', 'edit_tags'];
var query = 'SELECT COUNT(p.id) AS count FROM perms p JOIN users u ON p.id = u.id WHERE p.name = ?',
for(let name of names){
this.db.prepare(query).all([name]).map(value => data[name] = value.count);
}
它产生这样的东西:
upload_files: 5,
create_users: 2,
remove_users: 2,
edit_tags: 5,
假设 upload_files
有 5 行,remove_users
有 2 行,依此类推...
但是当我有 50K 条记录时,它非常慢,每个查询需要 2 秒。
可以合并到一个查询中吗?这样我就可以将所有名称的时间减少到 2 秒
使用 IN
过滤名称并按名称分组。
SELECT p.name,
count(p.id) count
FROM perms p
WHERE p.name IN ('upload_files',
'create_users',
'remove_users',
'edit_tags')
GROUP BY p.name;
并考虑尝试 name
上的索引是否可以加快速度。