簡體   English   中英

MYSQL減少了多個子查詢的執行時間

[英]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 classidcodesubject )值(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM