1

私は2つのテーブルを持っています:

current_challenges (challenge_id, award_type, award_at_count, expires_in_hours)

user_challenges (user_challenge_id, user_id, challenge_id, awarded)

テーブルはチャレンジのcurrent_challengesタイプであり、user_challengesテーブルは現在「アクティブ」であり、さまざまなユーザーのチャレンジがすでに「完了」しています。テーブルは を介し​​て接続されchallenge_idます。完了したチャレンジはawarded!= '0000-00-00 00:00:00' のチャレンジであり、'アクティブな'チャレンジはawarded設定された日時です。

私がやりたいのはchallenge_id、その特定のユーザーがまだ完了していないランダムなシングルを取得することですがaward_type、そのユーザーに対してアクティブなものが既に2つある場合は、選択しないでください。

そのため、ユーザーごとに同じ award_type でアクティブなチャレンジは最大 2 つだけにする必要があります。

例:

current_challenges テーブル:

challenge_id    award_type  award_at_count  expires_in_hours
49  1   1   24
50  1   2   24
51  1   3   24
52  2   4   24
53  2   5   24
54  2   6   24

user_challenges テーブル:

user_challenge_id   user_id     challenge_id    awarded
1   8   49  0000-00-00 00:00:00
2   8   50  0000-00-00 00:00:00
3   8   52  2012-12-06 13:58:27
4   11  53  0000-00-00 00:00:00
5   11  54  0000-00-00 00:00:00

ユーザー 8 の場合、challenge_id49,50 は既にアクティブであるため選択されません。51 は、award_type= '1' で既に 2 つアクティブになっているため、そうではありません。52 は既に完了しているため、返された として 53 または 54 のいずれかを残して、そうではありませんchallenge_id

長い投稿で申し訳ありませんが、できるだけ明確にしたかったのです。私は先日プレイしましたが、どこにも行きませんでした...LEFT JOINそしてHAVING COUNT()どこかで推測していますが、それを理解することはできません...

4

1 に答える 1

1

私はこれがあなたが望むものだと思います:

SELECT c.challenge_id
FROM current_challenges AS c
  LEFT JOIN
      ( SELECT cc.award_type                       --- find award types
        FROM current_challenges AS cc              --- with
          JOIN user_challenges AS ac            
            ON ac.challenge_id = cc.challenge_id   --- challenges
        WHERE ac.user_id = 8                       --- for this user
          AND ac.awarded = '0000-00-00'            --- that are active
        GROUP BY cc.award_type
        HAVING COUNT(*) >= 2                       --- and 2 or more
      ) AS ac
      ON ac.award_type = c.award_type
WHERE ac.award_type IS NULL                        --- and exclude them

  AND c.challenge_id NOT IN                        --- then exclude
      ( SELECT challenge_id                        --- any other challenges
        FROM user_challenges AS uc
        WHERE uc.user_id = 8                       --- for this user
      )
ORDER BY RAND()                                    --- order the result randomly
    LIMIT 1 ;                                      --- and choose one
于 2012-12-09T13:01:45.950 に答える