MYSQL уменьшает время выполнения нескольких подзапросов - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть 3 таблицы в моей базе данных, я запрашиваю тысячи записей, что делает мой запрос медленным, мой основной запрос имеет два подзапроса, которые подсчитывают записи.Хотя я получаю желаемый результат, я просто хочу знать, есть ли другие способы уменьшить время выполнения моего запроса, чтобы стать эффективными.

Желаемый вывод
classid - classcode - asotedinclass - validatedinclass

с использованием этого SQL-запроса запись 500+ выполняется около 2 минут

SELECT mainclass.id, mainclass.code, (SELECT Count(e.enrollno) FROM enrolldet AS e Inner Join enroll ON e.enrollno = enroll.enrollno Inner Join class ON e.classid= class.id WHERE enroll.assessed = '1' AND mainclass.id = class.id) as assessedinclass, (SELECT Count(e.enrollno) FROM enrolldet AS e Inner Join enroll ON e.enrollno = enroll.enrollno Inner Join class ON e.classid= class.id WHERE enroll.validated = '1' AND mainclass.id = class.id) as validatedinclass FROM class AS mainclass Left Join enrolldet ON mainclass.id = enrolldet.classid Left Join enroll ON enrolldet.enrollno = enroll.enrollno GROUP BY mainclass.id, mainclass.code

База данных

таблица class

CREATE TABLE IF NOT EXISTS `class` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `code` varchar(10) NOT NULL,
  `subject` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

-

- Сброс данных для таблицы class

INSERT INTO class (id, code, subject) ЗНАЧЕНИЯ (1, 'A1', 1), (2, 'A2', 2), (3, 'A3 ', 3), (4,' A4 ', 4);

таблица enroll

CREATE TABLE IF NOT EXISTS `enroll` (
  `enrollno` int(11) NOT NULL AUTO_INCREMENT,
  `student` int(11) NOT NULL,
  `acctok` tinyint(1) NOT NULL,
  `assessed` tinyint(1) NOT NULL,
  `validated` tinyint(1) NOT NULL,
  PRIMARY KEY (`enrollno`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

-

- Сброс данных для таблицы enroll

INSERT INTO `enroll` (`enrollno`, `student`, `acctok`, `assessed`, `validated`) VALUES
(1, 1, 1, 1, 0),
(2, 2, 1, 1, 1),
(3, 3, 1, 1, 0),
(4, 4, 0, 0, 0),
(5, 5, 1, 1, 1);  

таблица enrolldet

CREATE TABLE IF NOT EXISTS `enrolldet` (
  `enrollno` int(11) NOT NULL,
  `classid` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-

- данные сброса для таблицы enrolldet

INSERT INTO `enrolldet` (`enrollno`, `classid`) VALUES
(1, 1),
(1, 2),
(1, 3),
(1, 4),
(2, 1),
(2, 2),
(2, 3),
(2, 4),
(3, 1),
(3, 2),
(3, 3),
(3, 4),
(4, 1),
(4, 2),
(4, 3),
(4, 4),
(5, 1),
(5, 2),
(5, 3);

Я добавил только несколько записей в свой образец, но у меня есть тысячи записей для отображения.есть ли лучший запрос для этого?заранее спасибо

1 Ответ

0 голосов
/ 21 февраля 2019

Суммируйте выражение, а не подзапрос.Использование JOIN s вместо LEFT JOIN позволит сохранить некоторые записи при условии, что всегда найдется совпадение.

SELECT class.id, class.code,
  SUM(enroll.assessed =  '1') as assessedinclass,
  SUM(enroll.validated =  '1') as validatedinclass
FROM class
JOIN enrolldet ON class.id = enrolldet.classid
JOIN enroll ON enrolldet.enrollno = enroll.enrollno
GROUP BY class.id, class.code
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...