MySQL - Group By,Max,Inner Join - issue

时间:2011-09-21 19:06:16

标签: mysql sql join group-by aggregate-functions

在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
);

1 个答案:

答案 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 */

优化器可能会改进这一点,我不确定在没有看到架构的情况下是否需要加入awleva