首页 > 解决方案 > 从表中计算多个列值

问题描述

这是一个简单的表格,如下所示:

id TEXT,
name TEXT,
FOREIGN KEY(id) REFERENCES users(id) ON DELETE CASCADE,
PRIMARY KEY(id, name)

我想要的是能够获得一组包含该表中所有名称的计数的行。基本上每个名称出现在表中的次数。

到目前为止,这是我的代码,它可以工作:

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,

假设有 5 行upload_files, 2 行,remove_users依此类推......

但是当我有 50K 记录时它非常慢,每个查询需要 2 秒。

它可以组合在一个查询中吗?这样我可以将所有名字的时间减少到 2 秒

标签: sqlsqlitecountdatabase-performancekey-value

解决方案


使用名称过滤名称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可以加快速度。


推荐阅读