[英]MYSQL lessen execution time of multiple sub query
我的數據庫中有3個表,正在查詢數千條記錄,這使查詢變慢,我的主查詢有兩個對記錄進行計數的子查詢。 盡管我得到了我想要的輸出,但我只是想知道是否還有其他方法可以減少查詢的執行時間以提高效率。
所需的輸出
classid-類代碼-評估類-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);
我在示例中僅添加了幾條記錄,但是我要顯示數千條記錄。 有更好的查詢嗎? 提前致謝
對表達式求和而不是對子查詢求和。 假設始終存在匹配項,則使用JOIN
而不是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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.