Информация об изменениях

Сообщение MYSQL: оптимизация запроса от 26.11.2021 15:16

Изменено 26.11.2021 15:52 mogadanez

MYSQL: оптимизация запроса
есть такая табличка
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: оптимизация запроса
есть такая табличка
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


можно ли лучше?