在MySQL中遇到SQL问题。不确定是否正确归还所有奖励我的用户赢得了......但只有奖励级别的最高奖励级别奖励他们赢了。关系如下:
用户可以赢得许多奖励级别。每个 AwardLevel 都与名为 Award 的类别相关联。 奖励级别有难度等级(1,2或3) 这与Stackoverflow的徽章类似,并通过奖项的铜牌,银牌和金牌。
我正在尝试为用户带回所有奖励,但过滤到最高(难度)等级。例如,对于用户达到3级(难度= 3),他们必须首先获得难度= 1然后难度= 2.我不想用我的查询显示所有三个级别只是最高(MAX)。我当前查询的问题是GROUP BY似乎抓住了它为奖项找到的第一条记录。有时不是那个难度= 3的人。不确定我是否应该在查询中的其他位置放置MAX表达式。
更新的查询:
SELECT a.*, MAX(awlev.difficulty)
FROM Award AS a
INNER JOIN AwardLevel AS awlev ON awlev.id = a.level_id
WHERE a.user_id = 3 -- just a sample user_id
GROUP BY awlev.category_id
桌面设置: - 注意:我忘记了与用户相关的表格 - 在此表设置中赢得AwardLevels我称之为UserAwardLevels
CREATE TABLE Users (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
fullname VARCHAR(100)
);
CREATE TABLE AwardLevels (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
levelname VARCHAR(100),
difficulty INT
);
CREATE TABLE Awards (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
awardname VARCHAR(100)
);
CREATE TABLE UserAwardLevels (
user_id INT,
awardlevel_id INT
);
CREATE TABLE AwardLevels (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
levelname VARCHAR(100),
difficulty INT
);
答案 0 :(得分:1)
如果我理解你想要的东西,在Mysql中它有点笨拙,因为窗口函数不可用。但是,您可以尝试
SELECT a.* /* put desired columns in */
FROM AwardLevel as awlev JOIN Award AS a
ON awlev2.id = a2.level_id
JOIN
SELECT (a2.user_id, MAX(awlev2.difficulty) AS maxdifficulty
FROM Award AS a2 INNER JOIN AwardLevel2 AS awlev2 ON awlev2.id = a2.level_id
GROUP BY a2.user_id, awlev2.category_id) AS subquery
ON a.user_id = subquery.user_id AND awlev.difficulty = maxdifficulty
WHERE a.user_id = 999; /* whatever id */
优化器可能会改进这一点,我不确定在没有看到架构的情况下是否需要加入awlev
和a
。