Подсчет значений нескольких столбцов из таблицы - PullRequest
0 голосов
/ 12 января 2019

Это простая таблица, которая выглядит так:

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 и так далее ...

Но очень медленно, когда у меня 50К записей, каждый запрос занимает 2 секунды.

Может ли оно быть объединено в один запрос? таким образом, я могу сократить время до 2 секунд для всех имен

1 Ответ

0 голосов
/ 12 января 2019

Отфильтруйте имена, используя 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 ускоряет процесс.

...