1

我现在在一个复杂的 MySQL 查询上搜索了很多次。

这是一个成就系统。

表结构简单,形式对称。

第一个表 (achievements_base) 包含成就参考:每个成就有: - 一个 ID(行的 ID,自动递增和唯一), - 一个 code_id(成就的参考), - 一个 rank_id(成就的子类别code_id), - 和成就名称(显示目的)。

第二个表(achievements_user)包含用户获得的成就:每个解锁的成就都有: - 一个 ID(如果是行,自动递增且唯一), - code_id(成就的参考), - rank_id(子- 成就的 code_id 类别), - 和用户 ID。

表格语法是:

achievements_base
id - code_id - rank_id - name
1 - 1 - 1 - foo
2 - 1 - 2 - bar
3 - 1 - 3 - foobar
4 - 1 - 4 - foofoo
5 - 2 - 1 - barbar

achievements_user
id - code_id - rank_id - user_id
1 - 1 - 1 - 1
2 - 1 - 2 - 1
3 - 2 - 1 - 1

我想显示用户没有的成就(GROUP BY code_id)

In the table exemple above, for example, expected result is, for the user_id 1 :
3 - 1 - 3 - foobar

但我不知道该怎么做!我已经尝试过多次查询。

对不起我的英语,我是法国人!

谢谢 !

编辑,我尝试过的查询之一的示例:

SELECT AB.name
FROM achievements_base AB
RIGHT JOIN achievements_users AU 
ON AU.code_id = AB.code_id AND AU.rank_id = AB.rank_id
WHERE (SELECT COUNT(*) FROM achievements_users AU WHERE AU.user_id = 1) = 0
GROUP BY AB.code_id
ORDER BY AB.code_id ASC
4

3 回答 3

1
SELECT ab.*
FROM achievements_base ab
LEFT OUTER JOIN achievements_user au 
ON ab.id = au.code_id
WHERE au.user_id = {userid}

未经测试,我刚刚学习联接,但外部联接绝对是您想要使用的。

于 2012-10-31T00:36:02.963 回答
1

下面的呢?

SELECT code_id
FROM achievements_base
WHERE code_id NOT IN
( 
   SELECT code_id
   FROM achievements_user
   WHERE user_id = 1
)
GROUP BY code_id
于 2012-10-31T00:37:28.700 回答
0

这样的事情呢?编辑这应该可以解决问题..

SELECT 
    * 
FROM
    achievements_base 
WHERE id NOT IN 
    (SELECT 
        ab.id 
    FROM
        achievements_base ab 
        RIGHT JOIN achievements_user au 
            ON (
                ab.code_id = au.code_id 
                AND ab.rank_id = au.rank_id
            ) 
    WHERE au.user_id = 1)
于 2012-10-31T00:37:00.780 回答