数据库如下:
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 它完成了这项工作并且看起来没有任何bug
我试图限制用户和挑战的结果,这些用户和挑战只属于特定的类。因此,我的查询是这样的
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_idpart的作用是获取类中的用户
这个
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‘不明确。
这里我漏掉了什么?
发布于 2013-04-26 10:53:54
我不太清楚你想要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_idhttps://stackoverflow.com/questions/16227721
复制相似问题