2

最新バージョンの日付ベースのレポートバリエーションを取得する必要がある、ある種のバージョニングシステムのレポートクエリを作成する必要があります。簡略化されたテーブル構造は次のとおりです。

items_register: ir_id (primary, auto inc), ir_name (varchar)
items: i_id (primary, auto inc), i_register_id (int), i_version_name (varchar), i_datetime (datetime), i_date_expiry (datetime)

items_registerの各エントリには、複数のバージョンが関連付けられており、itemsテーブルのエントリとして保存されます。i_datetimeの最大値が最新バージョンです。

要求された日付($ f_date)の後に最新バージョン(item)にi_date_expiryがあるitems_registerからエントリを取得したいと思います。

どういうわけか、テーブルを結合し、アイテムをi_datetimeで並べ替え、1に制限して最新バージョンを取得し、i_date_expiryが$ f_dateの後にあるかどうかを確認し、フィールドを取得する必要があると思います。

取得したいフィールドは、items_register.ir_id、items_register.ir_name、items.i_version_name、items.i_datetimeです。

助けを求めるTIA。

4

2 に答える 2

2

「 groupwise max」パターンを検索しているようです。

あなたの質問でまだ明確でないことについていくつかの仮定を立てると、これがあなたが探しているクエリかもしれないと思います:

SELECT items_register.ir_id, items_register.ir_name, 
    items.i_version_name, items.i_datetime
FROM items_register
JOIN
(
    SELECT items.i_register_id, 
        MAX(items.i_datetime) AS most_recent_item_datetime
    FROM items
    WHERE items.i_date_expiry > '$f_date'
    GROUP BY items.i_register_id
) AS item_date ON item_date.i_register_id = items_register.ir_id
JOIN items ON items.i_register_id = items_register.ir_id 
    AND items.i_datetime = item_date.most_recent_item_datetime

これは、 $ f_dateが、このドキュメンテーション ページで説明されている日時リテラルとタイムスタンプ リテラル (日付リテラルではありません!) の標準に準拠する文字列であると想定していることに注意してください。

于 2012-05-28T00:23:46.793 に答える
2

多分これは役に立ちますか? http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html

于 2012-05-25T23:31:37.863 に答える