0

文書管理システムに取り組んでいますが、行き詰まっているようです。

データベースには、すべてのドキュメント番号 (一意) とそのすべてのリビジョン (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;

長い投稿で申し訳ありませんが、誰かが私を助けてくれるか、正しい方向に向けてくれることを望んでいました. 前もって感謝します!

4

2 に答える 2

0

@Konstantin Kiselevは私に正しい解決策を教えてくれたので、彼に感謝します。彼の提案で私の問題をどのように解決したかをここに書きます。

  1. 選択したすべてのドキュメントのリビジョンの中で最新の日付のリビジョンを見つけるには - 実際のリビジョン (ABC など) も必要なので、上記から変更:

    SELECT d.docnrlab, dr.*
    FROM documents d, docrevisions AS dr
    INNER JOIN 
    (
        SELECT dr.id, dr.doc_id, MAX( revisiondate ) AS revisiondate
        FROM docrevisions AS dr
        GROUP BY doc_id
    ) 
    AS CurrentRevision 
        ON CurrentRevision.doc_id = dr.doc_id
        AND CurrentRevision.revisiondate = dr.revisiondate
    WHERE d.id = dr.doc_id
    
  2. ユーザー XYZ に送信されたすべての選択されたドキュメントのリビジョンの中から最新の日付のリビジョンを見つけるには - ドキュメントがまったく送信されていない可能性があることについては言及していませんでした。

    SELECT dr.id, dr.doc_id, dr.revision , MAX( revisiondate ), 
        tr.transmittalnr, tr.userto_id,
        t2r.rsn,
        MAX(tr.shippingtimestamp)
    FROM docrevisions dr
    LEFT JOIN transmittals2revisions AS t2r ON dr.id = t2r.revisions_id
    LEFT JOIN transmittals AS tr ON t2r.transmittal_id = tr.id
    /*WHERE tr.id IS NOT NULL*/
    GROUP BY doc_id
    

/* すべて一緒に */

SELECT d.id doc_id, 
    d.docnrlab doc_nr_lab,
    rl.id last_revision_id, 
    rl.revision last_revision,
    rlt.id last_trans_revision_id, 
    rlt.revision last_trans_revision,
    rlt.transmittalnr,
    rlt.userto_id,
    rlt.rsn
FROM documents d,
    (
        SELECT d.docnrlab, dr.*
        FROM documents d, docrevisions AS dr
        INNER JOIN 
        (
            SELECT dr.id, dr.doc_id, MAX( revisiondate ) AS revisiondate
            FROM docrevisions AS dr
            GROUP BY doc_id
        ) 
        AS CurrentRevision 
            ON CurrentRevision.doc_id = dr.doc_id
            AND CurrentRevision.revisiondate = dr.revisiondate
        WHERE d.id = dr.doc_id
    ) rl,
    (
        SELECT dr.id, dr.doc_id, dr.revision , MAX( revisiondate ), 
            tr.transmittalnr, tr.userto_id,
            t2r.rsn,
            MAX(tr.shippingtimestamp)
        FROM docrevisions dr
        LEFT JOIN transmittals2revisions AS t2r ON dr.id = t2r.revisions_id
        LEFT JOIN transmittals AS tr ON t2r.transmittal_id = tr.id
        /*WHERE tr.id IS NOT NULL*/
        GROUP BY doc_id
    ) rlt
WHERE d.id = rl.doc_id 
    AND d.id = rlt.doc_id;
于 2013-11-02T17:24:03.793 に答える