2011-08-17 127 views
2

我需要一些幫助,通過mysql查詢子句的組。MySQL:集團條款

獎牌表(這適用所有獎牌)

+-----------------------------------------------------------------------+ 
| medal_id | medal_level | medal_name  | medal_type | medal_icon | 
|-----------------------------------------------------------------------| 
|  1 |   1 | 1 post medal |   1 | icon_file.png | 
|  2 |   2 | 1 thread medal |   2 | icon_file.png | 
|  3 |   1 | 2 post medal |   1 | icon_file.png | 
|  4 |   2 | 2 threads medal |   2 | icon_file.png | 
+-----------------------------------------------------------------------+ 

用戶獎牌表(這個擁有哪些用戶已經贏得獎牌)

+--------------------------------+ 
|medal_id |user_id | earnedtime | 
|--------------------------------| 
|  1 |  1 | 1313548360 | 
|  2 |  1 | 1313548365 | 
|  3 |  1 | 1313548382 | 
|  4 |  1 | 1313548410 | 
+--------------------------------+ 

MySQL查詢:

SELECT m.*, u.* 
FROM users_medals u 
LEFT JOIN medals m ON (u.medal_id=m.medal_id) 
WHERE u.user_id IN(1) 
GROUP BY m.medal_type 
ORDER BY u.earnedtime 

這是打算做的是顯示獎牌用戶已經贏得(這是一個公告板系統的插件)。它選擇並顯示用戶獎牌ID等於所有獎牌的表中的獎牌ID的獎牌。

這很好,但是,它不顯示最新的獎章。這只是顯示以下獎牌的ID:1,2.應當顯示3和4

附加信息:我只是想顯示每個獎章類型勳章。例如,如果用戶獲得了兩張「獎章」,則只顯示最新的獎章以及其他獲得的獎章。

任何幫助將不勝感激。

+2

你爲什麼使用GROUP BY? – Dalen

+0

@Dalen我需要以某種方式組合medal_type,所以它只顯示每種類型的獎章。 – Spencer

+0

如果它正在顯示medal_id 1(類型1)和medal_id 2(類型2)。然後它只顯示每種類型的1枚獎章。所以它工作? –

回答

1
SELECT m.*, u.* 
    FROM users_medals u 
    LEFT JOIN medals m ON u.medal_id = m.medal_id 
    WHERE u.user_id IN (1) 
    AND u.earnedtime = (
    SELECT MAX(users_medals.earnedtime) FROM users_medals 
    LEFT JOIN medals ON users_medals.medal_id = medals.medal_id 
    WHERE users_medals.user_id = u.user_id 
    AND medals.medal_type = m.medal_type 
) 

我想應該是可以做到這一點作爲增補太多,但獎牌類型另一個表正在取得我的頭都疼的限制。如果有兩張表連在一起的話,寫起來可能會更容易些。

+0

甜!這似乎是完美的工作!謝了哥們。 :) – Spencer

0

您有「GROUP BY medal_type」。由於您的獎牌表中只有1,2列值,因此您的結果中不會得到3 & 4。

+0

我想要的是隻顯示每個medal_type的獎牌。舉例來說,如果用戶有兩張「獎章」,最新的獎金將是唯一顯示的獎金。 – Spencer

0

它沒有顯示3和4,因爲您是按照獎牌類型對其進行分組。所以3和4和1和2相同的類型。如果你通過關閉它將顯示每個獎牌。

如果您希望此組,但只需要3和4。然後,你只需要

order by m.medal_type descending 
0

既然你是被獎牌類型分組,它只會選擇每種類型之一。如果你想獲得一個用戶獲得的所有獎牌的列表,你爲什麼按獎牌類型分組?

也許你正在尋找類型的獎牌的最高水平?如果是這種情況,您可能需要指定。

0

Dalen確實問過正確的東西 - 您爲什麼想首先使用GROUP BY?這在查詢中不需要。 GROUP BY服務於不同的目的;也許你可以通過檢查this one這樣的例子來了解它。