Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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
MySQL内部连接/最大值/组_Mysql_Sql - Fatal编程技术网

MySQL内部连接/最大值/组

MySQL内部连接/最大值/组,mysql,sql,Mysql,Sql,道歉,如果这已经涵盖,但我已经检查了许多其他问题,似乎无法得到我想要的结果 SQL小提琴 我想返回按类别分组的最高级别的成就。因此,虚拟数据将返回带有“新手平准者”和“业余银行家”的行 SELECT achievementid, a.title, a.level FROM player_achievements p INNER JOIN achievements a ON p.achievementid = a.id 我确实尝试过更改表abit(

道歉,如果这已经涵盖,但我已经检查了许多其他问题,似乎无法得到我想要的结果

SQL小提琴

我想返回按类别分组的最高级别的成就。因此,虚拟数据将返回带有“新手平准者”和“业余银行家”的行

SELECT 
    achievementid, 
    a.title,
    a.level
FROM 
    player_achievements p
    INNER JOIN achievements a ON p.achievementid = a.id
我确实尝试过更改表abit(将类别和级别添加到玩家成就中,感觉这是错误的,因为数据在另一个表中),并使用了以下查询:

SELECT 
    achievementid, 
    a.title 
FROM 
    player_achievements p1 
    INNER JOIN achievements a ON p1.achievementid = a.id 
WHERE 
    p1.level =(
        SELECT 
        MAX(p2.level) 
    FROM 
        player_achievements p2 
    WHERE 
        p1.category = p2.category
) 
AND playerid = 44
但是它只返回了一行

请看这个:

SELECT id, title
FROM achievements JOIN (
    SELECT category, max(level) level
    FROM player_achievements JOIN achievements ON achievementid = id 
    WHERE playerid = 44
    GROUP BY category
) t USING (category, level);
请看这个:

SELECT id, title
FROM achievements JOIN (
    SELECT category, max(level) level
    FROM player_achievements JOIN achievements ON achievementid = id 
    WHERE playerid = 44
    GROUP BY category
) t USING (category, level);

一种解决方案是像这样向子查询中添加
成就

SELECT 
    achievementid, 
    title 
FROM player_achievements pa1 
INNER JOIN achievements a1 ON pa1.achievementid = a1.id 
WHERE 
    a1.level =(
        SELECT MAX(a2.level) 
        FROM player_achievements pa2 
        INNER JOIN achievements a2 ON pa2.achievementid = a2.id 
        WHERE a1.category = a2.category and 
              pa2.playerid = pa1.playerid
    ) 
AND pa1.playerid = 44

一种解决方案是像这样将
成就
添加到子查询中

SELECT 
    achievementid, 
    title 
FROM player_achievements pa1 
INNER JOIN achievements a1 ON pa1.achievementid = a1.id 
WHERE 
    a1.level =(
        SELECT MAX(a2.level) 
        FROM player_achievements pa2 
        INNER JOIN achievements a2 ON pa2.achievementid = a2.id 
        WHERE a1.category = a2.category and 
              pa2.playerid = pa1.playerid
    ) 
AND pa1.playerid = 44

你的问题和数据毫无意义。“玩家”和这个问题有什么关系?为什么数据的成就ID不在成就表中?对于您给出的第二个代码集,当对子查询使用equal(=)运算符时,它将只返回一个值。你要做的是写“IN”而不是“equals”。写:“WHERE p1.level IN(SELECT…”,您将其写为“WHERE p1.level=(SELECT…”@GordonLinoff我现在已经更改了链接。@Oshan_Mendis我尝试了IN而不是=,它仍然只返回1行。您的问题和数据根本没有意义。“player”是什么意思与问题有关?为什么数据的成就ID不在成就表中?对于您给出的第二个代码集,当您对子查询使用equal(=)运算符时,它将只返回一个值。您需要做的是写入'in'而不是equals。写入:“WHERE p1.level in(SELECT…”其中您将其写为“Where p1.level=(SELECT.)@GordonLinoff我现在更改了链接。@Oshan_Mendis我用IN代替=尝试过,但它仍然只返回1行。我尝试过这个,但它给出了错误的数据。显示“银行家”的最大级别为2,但显示的是标准银行家而不是普通银行家,我尝试过的级别为1,它给出了错误的数据。显示“B”的最大级别为2anker’但显示的是标准银行家,而不是普通银行家,一级也一样