0

解決するのに最も効果的な方法を見つけようとしているというトリッキーな問題があります。

これが私のビュー構造の簡略化されたバージョンです。


表:監査

AuditID | PublicationID | AuditEndDate | AuditStartDate
1 | 3 | 2010年5月13日| 2010年1月1日
2 | 1 | 2009年12月31日| 2009年1月10日
3 | 3 | 2010年3月31日| 2010年1月1日
4 | 3 | 2009年12月31日| 2009年1月10日
5 | 2 | 2010年3月31日| 2010年1月1日
6 | 2 | 2009年12月31日| 2009年1月10日
7 | 1 | 2009年9月30日| 2009年1月1日

これから必要なクエリが3つあります。すべてのデータを取得するには、1つにする必要があります。次に、履歴データ(つまり、AuditEndDateによって最新のデータ項目を除外する以外のすべて)のみを取得し、最後のクエリは(AuditEndDateによって)最新のデータ項目を取得することです。

特定のユーザーグループが特定の日付の間でしか見ることができない日付制限(これはユーザー/グループごとにあります)があるという複雑さの追加の層があります。これは、where句でAuditEndDate<=blahおよびAuditStartDate>=blahとして認識されます。

出版物ごとに、利用可能なすべてのデータを選択します。

select * from Audits
Where auditEndDate<='31/03/10' and AuditStartDate>='06/06/2009';

パブリケーションごとに、すべてのデータを選択しますが、利用可能な最新のデータを除外します(AuditEndDateによる)

select * from Audits 
left join 
(select AuditId as aid, publicationID as pid
   and max(auditEndDate) as pend 
 from Audit where auditenddate <= '31/03/2009' /* user restrict */
 group by pid) Ax 
on Ax.pid=Audit.pubid
where pend!=Audits.auditenddate
AND auditEndDate<='31/03/10' 
and AuditStartDate>='06/06/2009' /* user restrict */

パブリケーションごとに、利用可能な最新のデータのみを選択します(AuditEndDateによる)

select * from Audits 
left join 
  (select AuditId as aid, publicationID as pid
    and max(auditEndDate) as pend 
   from Audit where auditenddate <= '31/03/2009'/* user restrict */
   group by pid) Ax 
on Ax.pid=Audit.pubid
where pend=Audits.auditenddate
AND auditEndDate<='31/03/10' 
and AuditStartDate>='06/06/2009' /* user restrict */

したがって、現時点では、クエリ1と3は正常に機能しますが、クエリ2は制限ではなくすべてのデータを返すだけです。

誰か助けてもらえますか?

ありがとう

ジェイソン

4

1 に答える 1

0

さて、実際には...これらのクエリは正常に機能します。それらを実行するのは私の条件付きPHPでした。すべて良い:)

私はそれを聞くことに興味がありますが、これのためのより効率的な方法を提案できる人は誰でも. 私はもともとwhere句でサブクエリを使用していましたが、これは非常に遅くなりました.2秒から50秒になりました....

于 2010-05-13T02:36:47.447 に答える