我现在在复杂的MySQL查询上多次搜索。
这是一个成就系统。
表格结构简单,形式对称。
第一个表(achievement_base)包含成就参考:每个成就都有: - ID(行的ID,自动增量和唯一), - code_id(成就的参考), - rank_id(成就的code_id的子类别), - 和成就名称(显示目的)。
第二个表(achievement_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
答案 0 :(得分:1)
SELECT ab.*
FROM achievements_base ab
LEFT OUTER JOIN achievements_user au
ON ab.id = au.code_id
WHERE au.user_id = {userid}
未经测试,我现在正在学习连接,但外连接肯定是你想要的。
答案 1 :(得分: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
答案 2 :(得分: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)