1

client_applicationこのようなデータで呼び出されるテーブルがあります。

Id   user_id   name      creationDate
---------------------------------------
1    5         name1     date
2    4         name2     date
3    98        name3     date

また、application_statusアプリケーションのステータス フィードを保持するテーブルも呼び出されます(application_id外部キーです)。

Id   aplication_id   status            other_columns      creationDate
----------------------------------------------------------------------
1    1       APPLICATION_SUMITTED      data               date
2    2       APPLICATION_SUMITTED      data               date
3    1       APPLICATION_RECEVIED      data               date
4    1       BANK_APPROVED             data               date
5    3       APPLICATION_SUMITTED      data               date
6    2       APPLICATION_RECEVIED      data               date

ステータスでアプリケーションを照会したい。たとえば、提出された最新のアプリケーションを取得しますか? または、銀行が承認したアプリケーションを入手してください。

このような SQL クエリを実装するにはどうすればよいですか?

私はこれを試しました;

SELECT *
FROM (SELECT * FROM application_status ORDER BY creationDate DESC) t1
LEFT JOIN client_application on client_application.id = t1.application_id
GROUP BY t1.application_id;

これで問題ありません。最新の状態のアプリケーションを取得できますが、where 句を入れようとすると、

SELECT *
FROM (SELECT * FROM application_status ORDER BY creationDate DESC) t1
LEFT JOIN client_application on client_application.id = t1.application_id
where t1.status = 'APPLICATION_SUBMITTED'
GROUP BY t1.application_id;

それはすべてのapplication_statusステータスAPPLICATION_SUBMITTED列を返します..1application_idつのアイテムを返します(上の表を確認してください)が、ご覧のとおり、ID番号1のアプリケーションはAPPLICATION_RECEIVED最新のステータスアイテムとしてステータスを持っています..したがって、結果セットでこれを期待することはできません.

多分私のアプローチは完全に間違っています。私はどんな解決策にもオープンです。

ありがとう。

4

3 に答える 3

1

私のアドバイスは、たとえば新しいテーブル「ステータス」を作成して、データベースの設計を改善することです。

Id   Label
1    APPLICATION_SUBMITTED
2    APPLICATION_RECEIVED
3    BANK_APPROVED 

ラベルに論理的な順序を付ける必要があり、ステータス テーブルまたはメイン テーブルでこのテーブルを参照します。

アプリケーションのステータスを簡単に取得できます (Status.Id < 3 で未承認のアプリケーションをすべて選択するか、Status.Id > 1 で少なくとも受信済みのすべてのアプリケーションを選択します)。

メンテナンス性にも優れています。この種のロジックは多くの場合に適用されるため、データ モデルの設計にもう少し時間を費やすことを検討する必要があります。これにより、現在直面しているこの種の問題の解決にこれ以上時間を費やさなくなります。

于 2012-11-27T13:18:03.367 に答える
1

なぜそこでグループ化したいのかわかりませんが、単にしたいだけかもしれません

select apps.*, ca.*
from application_status apps
 left join client_application ca on ca.id = apps.application_id
WHERE apps.status = 'APPLICATION_SUBMITTED'
  AND not exists ( select 1 
                   from application_status 
                   where application_id = apps.application_id 
                     and creationdate > apps.creationdate 
                  )
ORDER BY apps.creation_date DESC, apps.application_id

SQLフィドルを編集

于 2012-11-27T13:11:19.570 に答える
1

これを試して:

SELECT *
FROM (SELECT * FROM (SELECT * FROM application_status ORDER BY creationDate DESC) AS A GROUP BY application_id) AS t1
LEFT JOIN client_application ON client_application.id = t1.application_id
WHERE t1.status = 'APPLICATION_SUBMITTED'
于 2012-11-27T13:21:58.410 に答える