文書管理システムに取り組んでいますが、行き詰まっているようです。
データベースには、すべてのドキュメント番号 (一意) とそのすべてのリビジョン (ABC など) が含まれています。文書がクライアントに送信されるとき、私は送付状を使用します (文書 1234、改訂 B は送付状 6 とともにクライアント XYZ に送信されました)。
ここで、チームは、クライアント XYZ に送信された各ドキュメントの最新のリビジョンと最後のリビジョンを確認できる概要 (テーブル) を求めています。このようなもの:
---------------------------------------------------------------------------------------
| Documents || Latest Revision || Last sent Revision |
| || revision || revision | transmittalnr | sent To | Reason |
-------------||-----------------||- ---------------------------------------------------
| || || | | | |
| [docnrlab] || [revision] || [revision] | [transmittalnr] | [userto_id] | [rsn] |
---------------------------------------------------------------------------------------
私は1つのクエリでそれを達成しようとしてきましたが、私は専門家ではないので、それを成し遂げることはできません. 私が得たもの(試行錯誤によるもので、おそらく複雑なクエリを作成するための最良の方法ではありません)
/* all docs with al their revis */
SELECT * , revisiondate, docrevisions.id
FROM docrevisions
ORDER BY doc_id
/* for each doc: give the latest revi, which has a transmittal */
SELECT * , MAX( revisiondate ), docrevisions.id AS revi_id, transmittals2revisions . *
FROM docrevisions
LEFT JOIN transmittals2revisions ON docrevisions.id = transmittals2revisions.revisions_id
LEFT JOIN transmittals ON transmittals2revisions.transmittal_id = transmittals.id
WHERE transmittals.id IS NOT NULL
GROUP BY doc_id
/* testing */
SELECT docrevisions.id AS sent, docrevisions.id AS unsent, documents.docnrlab
FROM docrevisions
INNER JOIN transmittals2revisions AS t2revi1 ON sent = t2revi1.revisions_id
INNER JOIN transmittals2revisions AS t2revi2 ON unsent = t2revi2.revisions_id
INNER JOIN documents ON docrevisions.doc_id = documents.id
WHERE t2revi1.revisions_id IS NOT NULL
AND t2revi2.revisions_id IS NULL
GROUP BY doc_id
ORDER BY docrevisions.doc_id ASC
別のクエリでは、私の問題に役立つと思ったエイリアスを使用していますが、正しいものを見つける方法がわかりません:
$sql = "SELECT trm.*, userfrom.lastname AS UserFrom, userto.lastname AS UserTo
FROM transmittals AS trm
LEFT JOIN users AS userfrom ON userfrom.id = trm.userfrom_id
LEFT JOIN users AS userto ON userto.id = trm.userto_id";
以下は、関連するデータテーブルの構造です
CREATE SCHEMA IF NOT EXISTS `docguard` DEFAULT CHARACTER SET utf8 ;
USE `docguard` ;
-- -----------------------------------------------------
-- Table `docguard`.`documents`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `docguard`.`documents` (
`id` INT(10) NOT NULL AUTO_INCREMENT ,
`docnrsupplier` TEXT NULL DEFAULT NULL ,
`docnrlab` TEXT NULL DEFAULT NULL ,
`docnrclient` TEXT NULL DEFAULT NULL ,
`title1` TEXT NULL DEFAULT NULL ,
`title2` TEXT NULL DEFAULT NULL ,
`title3` TEXT NULL DEFAULT NULL ,
`title4` TEXT NULL DEFAULT NULL ,
`docsize_id` INT(10) NULL DEFAULT NULL ,
`docstate_id` INT(10) NULL DEFAULT NULL ,
`docformat_editable_id` INT(10) NULL DEFAULT NULL ,
`docformat_noneditable_id` INT(10) NULL DEFAULT '0' ,
`file_editable` TEXT NULL DEFAULT NULL ,
`file_noneditable` TEXT NULL DEFAULT NULL ,
`doccat_id` INT(10) NULL DEFAULT NULL ,
`docphase_id` INT(10) NULL DEFAULT NULL ,
`doctype_id` INT(10) NULL DEFAULT NULL ,
`company_id` INT(10) NULL DEFAULT NULL ,
`docrevisions_id` INT(10) NOT NULL ,
PRIMARY KEY (`id`) ,
INDEX `fk_documents_docrevisions_idx` (`docrevisions_id` ASC) )
ENGINE = MyISAM
AUTO_INCREMENT = 778
DEFAULT CHARACTER SET = utf8;
-- -----------------------------------------------------
-- Table `docguard`.`docrevisions`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `docguard`.`docrevisions` (
`id` INT(10) NOT NULL AUTO_INCREMENT ,
`doc_id` INT(10) NOT NULL ,
`revision` TEXT NOT NULL ,
`revisiondate` DATE NULL DEFAULT NULL ,
`user_id` INT(10) NULL DEFAULT NULL ,
`transmittals2revisions_id` INT(10) NOT NULL ,
PRIMARY KEY (`id`) ,
INDEX `fk_docrevisions_transmittals2revisions1_idx` (`transmittals2revisions_id` ASC) )
ENGINE = MyISAM
AUTO_INCREMENT = 1199
DEFAULT CHARACTER SET = utf8;
-- -----------------------------------------------------
-- Table `docguard`.`transmittals2revisions`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `docguard`.`transmittals2revisions` (
`id` INT(10) NOT NULL AUTO_INCREMENT ,
`transmittal_id` INT(10) NOT NULL ,
`revisions_id` INT(10) NULL DEFAULT NULL ,
`quantity` TINYINT(2) NOT NULL DEFAULT '1' ,
`rsn` TINYINT(1) NOT NULL DEFAULT '0' ,
PRIMARY KEY (`id`) )
ENGINE = MyISAM
AUTO_INCREMENT = 607
DEFAULT CHARACTER SET = utf8;
-- -----------------------------------------------------
-- Table `docguard`.`transmittals`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `docguard`.`transmittals` (
`id` INT(10) NOT NULL AUTO_INCREMENT ,
`transmittalnr` TEXT NOT NULL ,
`userfrom_id` INT(10) NULL DEFAULT NULL ,
`userto_id` INT(10) NULL DEFAULT NULL ,
`shippingtimestamp` DATE NULL DEFAULT NULL ,
`replybeforetimestamp` DATE NULL DEFAULT NULL ,
`note` TEXT NULL DEFAULT NULL ,
`tempname` TINYINT(1) NOT NULL DEFAULT '0' ,
`transmittals2revisions_id` INT(10) NOT NULL ,
PRIMARY KEY (`id`) ,
INDEX `fk_transmittals_transmittals2revisions1_idx` (`transmittals2revisions_id` ASC) )
ENGINE = MyISAM
AUTO_INCREMENT = 52
DEFAULT CHARACTER SET = utf8;
長い投稿で申し訳ありませんが、誰かが私を助けてくれるか、正しい方向に向けてくれることを望んでいました. 前もって感謝します!