0

データベースは次のとおりです。

Class_Memberships[id,user_id,class_id]
Class_Challenges[id,challenge_id,class_id]
Challenge_attempts[id,user_id,challenge_id,timestamp,solved]

ユーザーがチャレンジを完了するのにかかった試行回数であるスコアを計算する必要があります。

これをグローバルに(クラスを考慮せずに)行うには、次を実行します

SELECT user_id, time, count(*) as count, users.username
            FROM challenge_attempts LEFT JOIN users ON
            users.id = user_id WHERE status = 1 

どちらが機能し、バグはないようです

特定のクラスに属するユーザーと課題のみの結果を制限しようとしています。したがって、私のクエリはこれになります

SELECT class_memberships.class_id, user_id, count(*) as count
FROM class_memberships,users,class_challenges
WHERE class_memberships.class_id = 4 AND
      users.id = user_id AND
  user_id IN (
    SELECT user_id
    FROM challenge_attempts LEFT JOIN users ON
    users.id = user_id WHERE status = 1)
  AND class_challenges.challenge_id IN(
        SELECT challenge_id FROM class_challenges
    WHERE class_challenges.class_id = 4
    )

SELECT class_memberships.class_id, user_id, count(*) as count
FROM class_memberships,users,class_challenges
WHERE class_memberships.class_id = 4 AND
      users.id = class_memberships.user_id

一部は、クラス内のユーザーを取得することになっています

SELECT user_id
    FROM challenge_attempts LEFT JOIN users ON
    users.id = user_id WHERE status = 1

スコアを取得することになっています

そして最後に

SELECT challenge_id FROM class_challenges
    WHERE class_challenges.class_id = 4

クラスに属する課題にスコアを制限することになっています。しかし、それを実行しようとすると、フィールドリストの列 'class_id' があいまいです

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

4

1 に答える 1

0

COUNT() で何が必要なのかよくわかりませんが、問題が解決しない場合はお知らせください。

SELECT t1.class_id, t1.user_id, count(t3.id) as count
FROM class_memberships t1
INNER JOIN users t2 ON (t2.id = t1.user_id)
INNER JOIN class_challenges t3 ON (t3.class_id = t1.class_id)
WHERE t1.class_id = 4 
    AND t1.user_id IN (
        SELECT t4.user_id
        FROM challenge_attempts t4
        LEFT JOIN users ON users.id = t4.user_id 
        WHERE status = 1
    )
GROUP BY t1.user_id, t1.class_id
于 2013-04-26T02:53:53.950 に答える