2011-09-21 7 views
1

MySQL의 SQL에 문제가 있습니다. 확실하지 올바른 다시 원 한 사용자의 모든을 가지고 있었다 ...하지만 단지 의 가장 높은 AwardLevel들은이 수상했다. 관계 선박은 다음과 같습니다 :MySQL - Group By, Max, Inner Join - 문제

사용자은 많은 AwardLevel (s)을 이길 수 있습니다. 각 수상 레벨수상이라는 카테고리와 관련이 있습니다. AwardLevels의 등급은 (1, 2 또는 3) 입니다. 이것은 Stackoverflow의 배지와 유사하며 Bronze, Silver 및 Gold 유형의 상을 통과 한 것입니다.

나는 모든 상을 사용자에게 돌려 주려하지만 Max (난이도) 등급으로 필터링하고 있습니다. 예를 들어, 사용자가 레벨 3 (난이도 = 3)을 얻으려면 먼저 난이도 = 1, 난이도 = 2를 얻어야합니다. 내 쿼리가 최고 (MAX) 인 세 가지 레벨을 모두 표시하고 싶지는 않습니다. 현재 쿼리의 문제점은 GROUP BY가 보너스로 찾은 첫 번째 레코드를 가져 오는 것 같습니다. 때로는 난이도가 3이 아닌 경우가 있습니다. 3. MAX 식을 다른 쿼리 어딘가에 넣어야하는지 확실하지 않습니다.

업데이트] QUERY :

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 

표 설정 : - 참고 : I 사용자 관련된 테이블 잊고 있었던 - 나는 호출이 테이블 설정에서 원 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 */ 

시도 할 수있다, 그리고 나는이 awlev의 가입 a 스키마를 보지 않고 필요한 경우 확실하지 않다.