0

次のMySQLテーブルについて考えてみます。


アプリケーション(すべてのユーザーによるすべてのアプリケーションが含まれています)

unique_id |  user_id  |  date_of_application  |  date_ended  | score  |  status
--------------------------------------------------------------------------------
1            user_a          2010-09-09          2010-12-24     1.2      Ended
2            user_a          2011-03-03          2011-06-06     1.3      Ended
3            user_a          2011-08-08          2011-10-10     1.0      Ended

4            user_b          2010-09-09          2010-12-24     2.2      Ended
5            user_b          2011-03-03          2011-06-06     1.5      Ended

6            user_a          2012-01-01                                  Active
7            user_b          2012-01-02                                  Active
8            user_c          2012-01-03                                  Active
9            user_d          2012-01-04                                  Active


望ましい結果:

user_id  |  date_of_application  |  score  |  status
------------------------------------------------------
user_a          2011-01-01           1.0      Active
user_b          2011-01-02           1.5      Active

user_c          2011-01-03           10       Active
user_d          2011-01-04           10       Active


説明する; ステータスが「アクティブ」であるすべてのレコードを選択/表示したい。さらに、初めての申請者ではないユーザー(user_aおよびuser_b)のスコアは、 「終了」ステータスの前の最新のスコア(アプリケーション表の太字部分を参照)に設定されます。一方、初めてのユーザー(user_cおよびuser_d)のスコアは10に設定されます。


注/繰り返します:

  • 「終了した」アプリケーション/レコードのスコアは常に正であり、nullではないと想定します
  • user_cuser_d初めての応募者です
  • アプリケーションテーブルには、時間の経過とともに同じユーザーの複数のレコードが含まますが、ユーザーは一度に1つの「アクティブな」アプリケーション/レコードしか持つことができません。


まず、次のようなものがあります。this(またはこれに類似したクエリ)は、スコア列にNULLまたは0の値を与えました


SELECT userid_, date_of_application, status,
score = 
(
     SELECT score 
     FROM applications
     WHERE status = 'Ended' AND 
           date_of_application = (SELECT MAX(date_of_application)
                                  FROM applications
                                  WHERE status='Ended')
)

FROM applications

WHERE 
status = 'Active'

ORDER BY 
score ASC,
date_of_application ASC           


ここで何が欠けていますか?
TIA。

4

2 に答える 2

3

あなたがスコアを最新のものにしたいと考えています。これを試して -

SELECT apps.user_id, apps.date_of_application, apps.status,
       IFNULL(
              (SELECT app.score 
              FROM applications app
              WHERE  app.user_id = apps.user_id
              AND app.status = 'Ended' 
              ORDER BY app.date_ended DESC
              LIMIT 1), 10) AS score
FROM applications apps
WHERE  apps.status = 'Active'
ORDER BY apps.score ASC,
         apps.date_of_application ASC 
于 2012-05-24T18:57:04.220 に答える
1

それは動作するはずです:

SELECT user_id, date_of_application, status, coalesce(latest.score, 10) score
FROM applications
LEFT OUTER JOIN 
  (SELECT user_id, score 
   FROM applications a
   WHERE status = 'Ended' AND 
         date_of_application = (SELECT MAX(date_of_application)
                                FROM applications
                                WHERE status='Ended' AND user_id = a.user_id)) latest 
                                  ON latest.user_id = applications.user_id
WHERE status = 'Active'
ORDER BY date_of_application ASC
于 2012-05-24T18:53:18.587 に答える