У меня есть 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);
Я добавил только несколько записей в свой образец, но у меня есть тысячи записей для отображения.есть ли лучший запрос для этого?заранее спасибо