2013-04-26 43 views
0

數據庫如下:Mysql的選擇crossreferencing 3個表

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 

應該限制分數屬於類的挑戰。 但是,當我嘗試運行它sql輸出列'class_id'在字段列表中是不明確的

我在這裏錯過了什麼?

回答

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 
+0

謝謝你的回答,伯爵應該告訴我們有多少挑戰屬於用戶解決的問題。 – ndp 2013-04-26 09:35:39