1

さまざまな環境にデプロイしたパッケージに関する情報を保持するサーバーテーブルを含むデータベースがあります。次に、このデータベースを調べて、インストールされているソフトウェアの最新バージョンの全体像を Web ページの表に表示します。

私がやろうとしていて苦労しているのは、各環境にインストールされている各パッケージの最新バージョンを入手することです。この投稿の情報を使用し始めました。

各グループの最後のレコードを取得する

これは、ソフトウェアの別の側面で大いに役立ちましたが、私が落ち込んでいるのは、選択する基準が複数あるためです。データベースの関連部分は次のとおりです。

パッケージ バージョン テーブル

package_versions

id
server_name_id
package_name_id
version

パッケージ名テーブル

package_names

id
name

サーバー名テーブル

server_names

id
name
environment_name_id

最後に環境名テーブル

environment_names

id
name

この構造により、さまざまな環境にデプロイされたパッケージとバージョンの履歴を保持できます。

次に、各環境にデプロイされているすべてのパッケージの最新バージョンを取得する必要があります。私が言ったように、私は 1 つのテーブルと 2 つの基準だけで遊んでいたとき、上記の投稿のソリューションで成功しましたが、ここでは 4 つのテーブルと 2 つの基準です。

私の試行では、環境にインストールされているすべてのバージョンが返されます。

SELECT  environment_names.name as environment,
        package_names.display as package,
        package_names.name as pkg_name,
        package_versions.version as package_version
FROM    package_versions INNER JOIN package_names ON package_names.id = package_versions.package_name_id
                         INNER JOIN server_names ON server_names.id = package_versions.server_name_id
                         INNER JOIN environment_names ON environment_names.id = server_names.environment_name_id
                         LEFT JOIN package_versions pv ON (package_versions.package_name_id = pv.package_name_id 
                                                           AND package_versions.id < pv.id)
AND     pv.id IS NULL
ORDER BY environment_names.name, package_names.name

バージョン番号は Maven によって生成されるため、バージョン番号に Max を使用することはできません。そのため、xxx の形式であり、SNAPSHOT を含めることができます。

他の試みでは、最新バージョンがどこにでもインストールされているだけです。

LEFT 結合部分に何かを追加する必要があると思いますが、何を解決するのに本当に苦労しています。どんな助けでも感謝して受け取ります。

どうもありがとう、

ラッセル

4

3 に答える 3

0

全て、

すべての提案をありがとう、それらはすべて役に立ちました。

package_versions.id または package_versions.deploy_time に配置した MAX() 関数はどれも正しく機能しませんでした。たとえば、最新のバージョン ID を取得したように見えましたが、実際のバージョン番号はそのレコードと一致しませんでした。

これは、環境名を取得するために使用する必要があった 2 つのテーブルが原因であることがわかりました。サーバー テーブルを仲介として使用する必要がないように、PackageVersions テーブルにリレーションシップを追加しました。したがって、テーブルは次のようになります。

パッケージ バージョン表

package_versions

id
package_name_id
environment_name_id
version

(server_name_id はまだそこにあるので、それを使用して環境に関するより詳細な情報を得ることができます)。

パッケージ名表

package_names

id
name

環境名表

environment_names

id
name

これで、SQL クエリは次のようになります。

SELECT  package_versions.id,
        environment_names.name,
        package_names.name,
        package_versions.version,
        max(package_versions.id)
FROM    package_versions INNER JOIN environment_names ON package_versions.environment_name_id = environment_names.id
                         INNER JOIN package_names ON package_names.id = package_versions.package_name_id
GROUP BY environment_names.id, package_names.name                        
ORDER BY environment_names.name, package_names.name;

これにより、必要な情報が得られ、この新しいコードで置き換えるシステムと一致します。

Lucas と Nagaski の提案に感謝します。

ラッセル

于 2013-05-07T10:31:48.850 に答える
0
SELECT environment_names.name as environment,
       package_names.display as package,
       package_names.name as pkg_name,
       MAX(package_versions.version) as package_version
FROM package_versions 
INNER JOIN package_names ON package_names.id = package_versions.package_name_id                             
INNER JOIN server_names ON server_names.id = package_versions.server_name_id                             
INNER JOIN environment_names ON environment_names.id = server_names.environment_name_id
GROUP BY environment_names.name,
         package_names.display,
         package_names.name
ORDER BY environment_names.name, package_names.name
于 2013-05-03T14:09:27.810 に答える