Сообщение MYSQL: оптимизация запроса от 26.11.2021 15:16
Изменено 26.11.2021 15:52 mogadanez
MYSQL: оптимизация запроса
есть такая табличка
answered, opened, viewed
нужно посчитать сколько уникальных email имеют флажки answered, opened, viewed на уровне projectId, не важно для какого именно subProjectId,
те если один email в рамках одного projectId имеет несколько флажков для разных subProjectId — надо считать как один
пока придумался вариант с sub-query:
можно ли лучше?
CREATE TABLE stats (
id int(11) UNSIGNED NOT NULL,
companyId int(11) NOT NULL,
projectId int(11) NOT NULL,
subProjectId int(11) NOT NULL,
email varchar(255) NOT NULL,
answered tinyint(1) NOT NULL DEFAULT '0',
opened tinyint(1) NOT NULL DEFAULT '0',
viewed tinyint(1) NOT NULL DEFAULT '0',
)
ALTER TABLE stats
ADD PRIMARY KEY (id),
ADD UNIQUE KEY uniq_target (companyId,projectId,subProjectId,email);
answered, opened, viewed
нужно посчитать сколько уникальных email имеют флажки answered, opened, viewed на уровне projectId, не важно для какого именно subProjectId,
те если один email в рамках одного projectId имеет несколько флажков для разных subProjectId — надо считать как один
пока придумался вариант с sub-query:
SELECT s.projectId, SUM(s.answered), SUM(s.opened), SUM(s.viewed)
from (
SELECT projectId, email, MAX( answered ) as answered, MAX( opened) as opened, MAX(viewed) as viewed
FROM stats
where companyId = ?
group by projectId, email ) s
group by s.projectId
можно ли лучше?
MYSQL: оптимизация запроса
есть такая табличка
answered, opened, viewed — флажки 0,1
нужно посчитать сколько уникальных email имеют флажки answered, opened, viewed на уровне projectId, не важно для какого именно subProjectId,
те если один email в рамках одного projectId имеет несколько флажков для разных subProjectId — надо считать как один
пока придумался вариант с sub-query:
можно ли лучше?
CREATE TABLE stats (
id int(11) UNSIGNED NOT NULL,
companyId int(11) NOT NULL,
projectId int(11) NOT NULL,
subProjectId int(11) NOT NULL,
email varchar(255) NOT NULL,
answered tinyint(1) NOT NULL DEFAULT '0',
opened tinyint(1) NOT NULL DEFAULT '0',
viewed tinyint(1) NOT NULL DEFAULT '0',
)
ALTER TABLE stats
ADD PRIMARY KEY (id),
ADD UNIQUE KEY uniq_target (companyId,projectId,subProjectId,email);
answered, opened, viewed — флажки 0,1
нужно посчитать сколько уникальных email имеют флажки answered, opened, viewed на уровне projectId, не важно для какого именно subProjectId,
те если один email в рамках одного projectId имеет несколько флажков для разных subProjectId — надо считать как один
пока придумался вариант с sub-query:
SELECT s.projectId, SUM(s.answered), SUM(s.opened), SUM(s.viewed)
from (
SELECT projectId, email, MAX( answered ) as answered, MAX( opened) as opened, MAX(viewed) as viewed
FROM stats
where companyId = ?
group by projectId, email ) s
group by s.projectId
можно ли лучше?