2011-09-21 72 views
1

在MySQL中遇到SQL問題。不知道正確的是帶回所有用戶已經贏得了......但只有最高AwardLevel他們已經贏了。關係如下:MySQL - 分組最大,內部加入 - 問題

A 用戶可以贏得很多AwardLevel(s)。每個AwardLevel都與一個稱爲的類別綁定。 獲獎等級有難度等級(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

用戶可以贏得同一獎勵級別的多個獎項嗎? –

+0

在您的查詢中,沒有包含「t」別名的表。請修復。 –

+0

並不真正瞭解你的結構。 t.user_id中有什麼?你可以發表表格的結構嗎? – galchen

回答

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是必要的,沒有看到的模式。