2011-07-12 10 views
0

2つの分離要求に関して、MySQL 5.5でSQLクエリを最適化しようとしています。可能であれば、最後に1つのリクエストをしたいと思います。SQLと2複合結合

私はDocumentTypeテーブルを持っています(この質問の最後にあるスキーマを参照してください)。 私は、例えば、 "Program#4のためにアップロードされた5の3 DocumentInstance"を表示したいと思います。

プログラムごとの文書の合計をカウントするために、私はこのクエリを持っている:

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 

私の質問: は、各プログラムのために戻ってくる1つのクエリ、totalDocPerProgramを持ってすることが可能であり、どのように多くの文書はすでにアップロードされていますか? 「プログラム#3のためにさらに2つのドキュメントをアップロードしてください」というようなことがありますか?あなたの助けの人たちのための

おかげで、

ニコラス

はここにあなたの既存の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; 
+0

2番目のクエリはp2.idとwsc2.id.の両方でグループに必要

where b.userSession = constant 

句を含める場合は特に、よく働きます –

答えて

1

あなたがこれを行うことができます。ように:

select a.programId, 
     a.totalDocPerProgram, 
     b.upLoadedDocs, 
     (a.totalDocPerProgram - b.upLoadedDocs) as remainingDocs, 
     b.userSession 
from (
    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) a 
join (
    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 p2.id, wsc2.id) b on a.ProgramId = b.ProgramId 

私はこれをデバッグしていません。しかし、この種のものは、あなたが

+0

ありがとう、それはまさに私が探していたものです! –