Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL:复杂查询动态选择?_Php_Mysql_Sql_Join - Fatal编程技术网

Php MySQL:复杂查询动态选择?

Php MySQL:复杂查询动态选择?,php,mysql,sql,join,Php,Mysql,Sql,Join,我现在在一个复杂的MySQL查询上搜索了很多次 这是一个成就体系 表的结构简单,形式对称 第一个表(成就库)包含成就参考:每个成就都有: -ID(行的ID,自动递增且唯一), -代码id(成果参考), -等级id(成就代码id的子类别), -以及成就名称(显示目的) 第二个表(成就\用户)包含用户获得的成就:每个成就都有: -一个ID(如果是行的,则自动递增且唯一), -代码id(成果参考), -等级id(成就代码id的子类别), -和用户id 表格语法为: achievements_base

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

这是一个成就体系

表的结构简单,形式对称

第一个表(成就库)包含成就参考:每个成就都有: -ID(行的ID,自动递增且唯一), -代码id(成果参考), -等级id(成就代码id的子类别), -以及成就名称(显示目的)

第二个表(成就\用户)包含用户获得的成就:每个成就都有: -一个ID(如果是行的,则自动递增且唯一), -代码id(成果参考), -等级id(成就代码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
我想显示用户没有的成就(按代码\u id分组)

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

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

谢谢

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

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

未经测试,我正在学习连接,但外部连接肯定是您想要的。

类似的东西怎么样编辑这应该可以做到

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)

下面呢

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

如果语法不好,那么它是有效的!非常感谢!;)在这里仔细检查。。这将只检查代码id,而不是代码id和等级id的组合。我不确定这是否符合您的目的。如果是,那太好了!:)不抱歉,外部联接不是解决方案;)
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)
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