2012-02-23 113 views
0

蔣張關係與優化這個子查詢計數項目:的MySQL,優化子查詢

SELECT @crewid:=crewid AS `crewid`, COUNT(id) AS `number_documents`, 
     (SELECT COUNT(id) FROM tblScan WHERE classification IS NOT NULL AND crewId = @crewid) AS `classified`, 
     (SELECT COUNT(id) FROM tblScan WHERE classification IS NULL AND crewId = @crewid) AS `unclassified`, 
     (SELECT CONCAT(name, ' ', surname) FROM tblcrew WHERE crewId = @crewid) AS `crewname`, 
     (SELECT uploadeddate FROM tblScan WHERE crewid = @crewid ORDER BY uploadeddate DESC LIMIT 0,1) AS `uploadeddate`, 
     (SELECT uploadedby FROM tblScan WHERE crewid = @crewid ORDER BY uploadedby DESC LIMIT 0,1) AS `uploadedby`, 
     (SELECT updateddate FROM tblScan WHERE crewid = @crewid AND updateddate IS NOT NULL ORDER BY updateddate DESC LIMIT 0,1) AS `updateddate`, 
     (SELECT updatedby FROM tblScan WHERE crewid = @crewid AND updatedby IS NOT NULL ORDER BY updatedby DESC LIMIT 0,1) AS `updatedby` 
     FROM tblScan 

希望有人能夠幫助

感謝,
德爾斯

回答

2
SELECT 
    `tblScan`.`crewId` AS `crewid` 
    COUNT(`tblScan`.`id`) AS `number_documents`, 
    SUM(IF(`tblScan`.`classification` IS NOT NULL,1,0)) AS `classified`, 
    SUM(IF(`tblScan`.`classification` IS NULL,1,0)) AS `unclassified`, 
    CONCAT(`tblcrew`.`name`, ' ', `tblcrew`.`surname`) AS `crewname`, 
    MAX(`tblScan`.`uploadeddate`) AS `uploadeddate`, 
    MAX(`tblScan`.`uploadedby`) AS `uploadedby`, 
    MAX(IFNULL(`tblScan`.`updateddate`,'0000-01-01')) AS `updateddate`, 
    MAX(IFNULL(`tblScan`.`updatedby`,'0')) AS `updatedby` 
FROM tblScan 
INNER JOIN tblcrew ON `tblcrew`.`crewId`=`tblScan`.`crewId` 
GROUP BY `tblScan`.`crewId` 
+0

__SUM(IF('tblScan'。 'classification' is NOT NULL,1,0))as'classified'__也可以寫成__count('tblScan'.'classification')__,因爲它只會返回非NULL值的計數。檢查[this](http://dev.mysql.com/doc/refman/5.0/en/problems-with-null.html) – 2012-02-23 11:20:37

+0

@husbas是的,它可以。我的代碼本來是有教育意義的,並不富有成效 - 從OQ中我得到了印象,OP可以通過理解原理來優化他的許多疑問。 – 2012-02-23 11:24:56

+0

非常感謝 – Dels 2012-02-27 08:17:11