2013-04-26 45 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