【问题标题】:MySQL - Group By, Max, Inner Join - issueMySQL - Group By、Max、Inner Join - 问题
【发布时间】:2011-09-21 19:06:16
【问题描述】:

在 MySQL 中遇到 SQL 问题。不确定正确的是带回我的用户赢得的所有奖项...但只有中最高的AwardLevel 他们赢得了。关系如下:

一个用户可以赢得许多AwardLevel(s)。每个 AwardLevel 都与一个称为 Award 的类别相关联。 AwardLevels 有难度等级(1、2 或 3) 这类似于 Stackoverflow 的徽章,并通过铜、银和金类型的奖项。

我正在尝试为用户恢复所有奖项,但已过滤到最大(难度)评级。例如,要让用户达到 3 级(难度 = 3),他们必须首先获得难度 = 1,然后难度 = 2。我不想在我的查询中只显示最高 (MAX) 的所有三个级别。我当前查询的问题是 GROUP BY 似乎抓住了它为 Award 找到的第一条记录。有时哪个不是难度 = 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
);

【问题讨论】:

  • 同一奖励等级的用户能否获得多个奖励?
  • 在您的查询中没有别名为t 的表。请修复。
  • 不太了解您的结构。 t.user_id 中的 t 是什么?你能发布表格的结构吗?
  • 更正了这个问题。我试图简化问题。归结为主要问题。查询已更正。 user_id 字段是奖励记录的一部分。
  • @Scrum 大师,您只能赢得 1 次 1 级。您可以在一个类别(即奖项)中赢得 1 级、2 级和 3 级。

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


【解决方案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 的连接是否有必要在没有看到架构的情况下进行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多