0

私はこれらの2つのテーブルを扱ってきました:

書類

id    company_id    etc
=======================
1     2             x
2     2             x

バージョン

id    document_id   version    date_created    date_issued   date_accepted
==========================================================================
1     1             1          2013-04-29      2013-04-30    NULL
2     2             1          2013-05-01      NULL          NULL
3     1             2          2013-05-01      2013-05-01    2013-05-03

すべてのドキュメントとその属性を一覧表示したいページがあります。そして、各ドキュメントから単一の所有ステータスを追加したいと思います。ステータスは、対応する の最新の日付から導き出すことができますVersion。古いバージョンが受け入れられている可能性があります。

私が探しているクエリ結果は次のようになります。

id    company_id    etc   status
==================================
1     2             x     accepted
2     2             x     created

まず、すべての日付を結合し、その横にステータスを追加するクエリを作成しました。それは期待どおりに機能し、document_id を追加すると問題ないように見えます。

SELECT `status`
FROM (
    SELECT max(date_created) as `date`,'created' as `status` FROM version WHERE document_id = 1
    UNION
    SELECT max(date_issued),'issued' FROM version WHERE document_id = 1
    UNION
    SELECT max(date_accepted),'accepted' FROM version WHERE document_id = 1
    ORDER BY date DESC
    LIMIT 1
) as maxi

このクエリをサブクエリとして取り込もうとすると、うまくいきません。

SELECT *, (
  SELECT `status` FROM (
    SELECT max(date_created) as `date`,'created' as `status`FROM version WHERE document_id = document.id
    UNION
    SELECT max(date_issued),'issued' FROM version WHERE document_id = document.id
    UNION
    SELECT max(date_accepted),'accepted' FROM version WHERE document_id = document.id
    ORDER BY date DESC
    LIMIT 1
  ) as maxi
) as `status`
FROM `document`

これにより、エラーが発生しますUnknown column 'document.id' in 'where clause'。だから私はSOを読んでoffer.id、サブクエリのサブクエリであるため、単に値に到達できないと考えました。そこで、別のアプローチを取り、すべてのステータスを一度に取得して、WHEREステートメントを回避し、JOIN しようとしました。次のクエリで終わりました。

SELECT MAX(`date`),`status`, document_id
FROM (
    SELECT datetime_created as `date`, 'created' as `status`,document_id FROM `version`
    UNION
    SELECT datetime_issued, 'issued',document_id FROM `version`
    UNION
    SELECT datetime_accepted, 'accepted',document_id FROM `version`
) as dates
GROUP BY offer_id

今回はエラーではありませんでしたがstatus、途中で紛失してしまったので、正しいものではないことに気付きましたGROUP BY。私は 2 つの組み合わせを試しましたが、両方の欠点が私を妨げ続けています。データベースを変更せずに単一のクエリでこれを行う方法を提案できますか? (日付を別のテーブルに保存すると簡単になることはわかっています)

4

3 に答える 3

0
select Doc.document_id,Doc.company_id,Doc.etc,f.status
from Document Doc
inner join 
    (select Ver.document_id,
    case when Ver.date_accepted is not null then 'Accepted'
    when Ver.date_issued is not null then 'Issued'
    when Ver.date_created is not null then 'Created'
    end as status
from version Ver
inner join (
                select document_id,MAX(version) VersionId
                from version
                group by document_id
            )t on t.document_id=Ver.document_id 
where t.VersionId=Ver.version
)f on Doc.document_id=f.document_id

SQL フィドル

于 2013-05-03T12:21:00.600 に答える
0

テーブルのデザインを標準化して、ステータス/日付をバージョンとは別のテーブルに移動できますか?

おそらくこのようなものがない場合:-

SELECT Document.id, Document.company_id, Document.etc, CASE WHEN Sub1.status = 3 THEN 'accepted' WHEN Sub1.status = 2 THEN 'issued' WHEN Sub1.status = 1 THEN 'created' ELSE NULL END AS status
FROM Document
INNER JOIN (
    SELECT document_id, MAX(CASE WHEN date_accepted IS NOT NULL THEN 3 WHEN date_issued IS NOT NULL THEN 2 WHEN date_created IS NOT NULL THEN 1 ELSE NULL END) AS status 
    FROM Version
    GROUP BY document_id
) Sub1
ON Document.id = Sub1.document_id

副選択は、バージョン テーブルからすべてのドキュメントの最高のステータスを取得します。考えられる各バージョンの最高ステータスが数値として返され、それをドキュメント ID でグループ化することにより、任意のバージョンの最高ステータスを取得します。これは Document テーブルと結合され、バージョン番号の番号がテキストの説明に変換されます。

于 2013-05-03T13:32:42.630 に答える