MySQL内部连接/最大值/组
道歉,如果这已经涵盖,但我已经检查了许多其他问题,似乎无法得到我想要的结果 SQL小提琴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(
我想返回按类别分组的最高级别的成就。因此,虚拟数据将返回带有“新手平准者”和“业余银行家”的行
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’但显示的是标准银行家,而不是普通银行家,一级也一样