我想優化與MySQL 5.5,關於2分離請求的SQL查詢。如果可能的話,我希望在最後有一個請求。SQL和2複雜的聯接
我有一個DocumentType表(請參閱此問題末尾的架構)。 例如,我想顯示「針對程序#4上傳的5個文檔實例5」。
要計算總的每個程序文件,我有這個疑問:
select p.id as programId, count(dt.id) as totalDocPerProgram
from DocumentType dt
join DocumentTypeInProgram dtip on dtip.documentType_id=dt.id
join Program p on dtip.program_id=p.id
group by p.id
要計算用戶已經多少文檔已上傳,通過程序分類,下面的查詢返回userSession以及如何列表許多文檔他以前上傳:
select p2.id as programId, wsc2.id as userSession, count(di2.id) as uploadedDocs
from DocumentType dt2
join DocumentInstance di2 on di2.documentType_id=dt2.id
join WebsiteCase wsc2 on di2.websiteCase_id=wsc2.id
left join Program p2 on p2.id=wsc2.program_id
group by wsc2.id
我的問題: 是否有可能有一個將返回每個程序一個單一的查詢中,totalDocPerProgram如何很多文件已經上傳了? 是否有可能擁有類似「請爲程序#3再上傳2個文檔」?
感謝您的幫助球員,
薩科
下面是數據庫SQL定義腳本
CREATE TABLE `DocumentType` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`description` varchar(255) DEFAULT NULL,
`lifetime` int(11) DEFAULT NULL,
`maxDocumentSize` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
CREATE TABLE `Program` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
CREATE TABLE `DataTypeForProgram` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`cardinality` int(11) DEFAULT NULL,
`dataType_id` bigint(20) DEFAULT NULL,
`program_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FKA6CED6BFFCC6BB96` (`program_id`),
KEY `FKA6CED6BF17C2EE7E` (`dataType_id`),
CONSTRAINT `FKA6CED6BF17C2EE7E` FOREIGN KEY (`dataType_id`) REFERENCES `DataType` (`id`),
CONSTRAINT `FKA6CED6BFFCC6BB96` FOREIGN KEY (`program_id`) REFERENCES `Program` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
CREATE TABLE `WebsiteCase` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`creationDate` datetime DEFAULT NULL,
`lastUpdate` datetime DEFAULT NULL,
`program_id` bigint(20) NOT NULL,
PRIMARY KEY (`id`),
KEY `FK_Program` (`program_id`),
CONSTRAINT `FK_Program` FOREIGN KEY (`program_id`) REFERENCES `Program` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
CREATE TABLE `DocumentInstance` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`url` varchar(255) DEFAULT NULL,
`documentType_id` bigint(20) DEFAULT NULL,
`websiteCase_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FK8BE8C2F05F1A4ADE` (`documentType_id`),
KEY `FK8BE8C2F05C57B856` (`websiteCase_id`),
CONSTRAINT `FK8BE8C2F05C57B856` FOREIGN KEY (`websiteCase_id`) REFERENCES `WebsiteCase` (`id`),
CONSTRAINT `FK8BE8C2F05F1A4ADE` FOREIGN KEY (`documentType_id`) REFERENCES `DocumentType` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
CREATE TABLE `DocumentTypeInProgram` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`cardinality` int(11) DEFAULT NULL,
`documentType_id` bigint(20) DEFAULT NULL,
`program_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `FK190E2A0A5F1A4ADE` (`documentType_id`),
KEY `FK190E2A0AFCC6BB96` (`program_id`),
CONSTRAINT `FK190E2A0AFCC6BB96` FOREIGN KEY (`program_id`) REFERENCES `Program` (`id`),
CONSTRAINT `FK190E2A0A5F1A4ADE` FOREIGN KEY (`documentType_id`) REFERENCES `DocumentType` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
SET FOREIGN_KEY_CHECKS = 0;
你的第二個查詢雙方p2.id和wsc2.id.需要組 –