私はこれらの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 つの組み合わせを試しましたが、両方の欠点が私を妨げ続けています。データベースを変更せずに単一のクエリでこれを行う方法を提案できますか? (日付を別のテーブルに保存すると簡単になることはわかっています)