2012-01-21 6 views
0

これは私のための本当に頭の傷です。基本的に私は3つのMySQLテーブルを持っていて、誰かのスコアを総括的に記録しています(ゲームのために)。常に新しいスコアを入力できます。本質的に私が把握する必要があるのは、プレイヤーが過去1週間からスコアを上げたことです(これは、週が始まる前とその後にスコアが必要です)。ここに私のテーブルレイアウトは次のとおりです。IDに関連する日付と価値を比較します

USER     REQUEST (ASSOCIATIVE TABLE)     SCORE 
+----------+ +-----------------------------------------+  +--------------------+ 
| id (int) | | id | user_id | date (UNIX TS) |  | request_id | score | 
+----------+ +-----------------------------------------+  +--------------------+ 
| 3  | | 1 |  3  | before week  |  |  1  | 10 | 
| 4  | | 2 |  3  | after week  |  |  2  | 20 | 
| 5  | | 3 |  4  | before week  |  |  3  | 5 | 
+----------+ | 4 |  5  | after week  |  |  4  | 15 | 
       +-----------------------------------------+  +--------------------+ 

ので、基本的に、これらのテーブルから、私は彼がこの最後の週に彼のスコアを向上させただけだから返される3のIDを持つユーザーを持っていると思います。あなたの助けのための

SELECT user.id AS user_id, score, count(*) AS n 
FROM user 
LEFT JOIN request ON request.user_id = user.id 
LEFT JOIN score ON score.request_id = request.id WHERE request.date > (WEEK UNIX TS) 
GROUP BY user_id HAVING n > 1 
ORDER BY request.date DESC 

感謝を:私は来ているが、私は本当に前進トラブルを抱えていますどこ

はこれまでのところ、これは! :)

+0

ユーザーは、現在の(または前の)週に複数のリクエスト(したがってスコア)を持つことができますか? –

+0

はい、その場合は、その週の最大得点を使用する必要があります。 – flicker

答えて

1
SELECT user.id    AS user_id 
    , MAX(sc_now.score) AS score_now 
    , MAX(sc_prev.score) AS score_previous 

FROM user 

    JOIN request AS req_now 
    ON req_now.user_id = user.id 
    AND req_now.date > (WEEK UNIX TS) --- condition for this week 
    JOIN score AS sc_now 
    ON sc_now.request_id = req_now.id 

    JOIN request AS req_prev 
    ON req_prev.user_id = user.id 
    AND req_prev.date BETWEEN ? AND ? --- condition for previous week 
    JOIN score AS sc_prev 
    ON sc_prev.request_id = req_prev.id 

GROUP BY user.id 

HAVING MAX(sc_now.score) > MAX(sc_prev.score) 
+0

これはその外観で動作するようです。どうもありがとう! – flicker