1

1 つのテーブルからデータを正しくフェッチする sql-statement があります。ただし、という名前の n 個のテーブルから同じ方法でフェッチする必要がありtable_nます。これらのすべてのテーブルには、 と の 3 つのフィールドの主キーが含まれてprojiddocidますrevnr。テーブルを区別するために、私も同様nに戻る必要があります。結果はおよび/またはdocTypeでソートされます。projiddocid

PHP でさまざまなクエリからのすべての出力を並べ替えようとしましたが、遅すぎました (3MB のデータベースでは少なくとも数秒かかりました)。MySQL/MSSQL の方が高速であると確信しています。

これは私の現在のクエリです:

 SELECT a.*  FROM   `table_1` a  
        INNER JOIN (SELECT docid,  
                           Max(revnr) max_val  
                    FROM   `table_1`  
                    WHERE  ( projid = something )  
                    GROUP  BY docid) b  
                ON a.docid = b.docid  
                   AND a.revnr = b.max_val  ORDER  BY docid DESC  

revnr私の現在のクエリは、 とのそれぞれdocidで最高の行を取得しますprojid

私は MySQL で開発していますが、MSSQL でも動作する必要があります。一般的な SQL ソリューションは素晴らしいでしょう。

ありがとう!

編集:私が現在持っているテーブルのテーブルスキーマ:

CREATE TABLE IF NOT EXISTS `table_1` (
  `projid` int(11) NOT NULL,
  `docid` int(11) NOT NULL,
  `revnr` int(11) NOT NULL,
  `revname` varchar(64) NOT NULL,
  `signedOn` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `sign` int(11) NOT NULL,
  `ritningsnr` varchar(128) NOT NULL,
  `moment` varchar(256) NOT NULL,
  `omrade` varchar(256) NOT NULL,
  `start` datetime NOT NULL,
  `stop` datetime NOT NULL,
  `extTodo` int(11) NOT NULL,
  PRIMARY KEY (`projid`,`docid`,`revnr`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='egenkontroll';



CREATE TABLE IF NOT EXISTS `table_2` (
  `projid` int(11) NOT NULL,
  `docid` int(11) NOT NULL,
  `revnr` int(11) NOT NULL,
  `revname` varchar(64) NOT NULL,
  `signedOn` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `sign` int(11) NOT NULL,
  `extWater` int(11) NOT NULL,
  `extRisk` int(11) NOT NULL,
  `extSystem` int(11) NOT NULL,
  `extHelp` int(11) NOT NULL,
  `extProvtryck` int(11) NOT NULL,
  `extDoc` int(11) NOT NULL,
  `extEgenkontroll` int(11) NOT NULL COMMENT 'exttabell',
  `extOther` int(11) NOT NULL,
  `extMontorer` int(11) NOT NULL,
  PRIMARY KEY (`projid`,`docid`,`revnr`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='arbetsberedning';


CREATE TABLE IF NOT EXISTS `table_3` (
  `projid` int(11) NOT NULL,
  `docid` int(11) NOT NULL,
  `revnr` int(11) NOT NULL,
  `revname` varchar(64) NOT NULL,
  `adress` varchar(256) NOT NULL,
  `pipesMark` tinyint(1) NOT NULL,
  `pipesKulvert` tinyint(1) NOT NULL,
  `pipesBasement` tinyint(1) NOT NULL,
  `pipesVaning` tinyint(1) NOT NULL,
  `pipesIngjutna` tinyint(1) NOT NULL,
  `ledningTappvatten` tinyint(1) NOT NULL,
  `ledningVarmevatten` tinyint(1) NOT NULL,
  `ledningHetvatten` tinyint(1) NOT NULL,
  `ledningKylaPrim` tinyint(1) NOT NULL,
  `ledningKylaSek` tinyint(1) NOT NULL,
  `ledningGas` tinyint(1) NOT NULL,
  `ledningLuft` tinyint(1) NOT NULL,
  `ledningAvlopp` tinyint(1) NOT NULL,
  `ledningOther` varchar(512) NOT NULL,
  `materialGjutjarn` tinyint(1) NOT NULL,
  `materialSteel` tinyint(1) NOT NULL,
  `materialKoppar` tinyint(1) NOT NULL,
  `materialPlast` tinyint(1) NOT NULL,
  `materialRostfritt` tinyint(1) NOT NULL,
  `materialOther` varchar(512) NOT NULL,
  `omfattningLength` int(11) NOT NULL COMMENT 'meter',
  `omfattningDimension` varchar(16) NOT NULL,
  `omfattningRitningnr` varchar(128) NOT NULL,
  `doneWithPump` tinyint(1) NOT NULL,
  `doneWithVattenledning` tinyint(1) NOT NULL,
  `doneWithKompressor` tinyint(1) NOT NULL,
  `doneWithTathetsprovare` tinyint(1) NOT NULL,
  `tryckmedieVatten` tinyint(1) NOT NULL,
  `tryckmedieLuft` tinyint(1) NOT NULL,
  `tryckmedieOther` varchar(128) NOT NULL,
  `manometerDiameter` int(11) NOT NULL COMMENT 'mm',
  `manometerGradering` int(11) NOT NULL COMMENT 'kPa',
  `manometerReadPressure` int(11) NOT NULL,
  `manometerTid` int(11) NOT NULL COMMENT 'sekunder',
  `testedOn` datetime NOT NULL,
  `testedBy` varchar(128) NOT NULL COMMENT '"id_" + (userid)',
  `comments` varchar(1024) NOT NULL,
  `commentsBy` varchar(128) NOT NULL COMMENT '"id_" + (userid)',
  `signedOn` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `sign` int(11) NOT NULL,
  PRIMARY KEY (`projid`,`docid`,`revnr`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

必要なフィールドはprojiddocidrevnrrevnamesignedOnsignあり、現在および将来のすべてのテーブルに存在します。

4

0 に答える 0