2011-08-17 11 views
2

私はmysqlクエリ句でグループにいくつかの助けが必要です。MySQL:Group By Clause

メダル表(これはすべてのメダルを保持している)

+-----------------------------------------------------------------------+ 
| 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

追加情報を表示する必要があります。を私は、各メダルの種類からメダル1枚を表示したいです。たとえば、ユーザーが2つの「ポストメダル」を獲得した場合、獲得した最新のメダルだけでなく、獲得した他のメダルも表示されます。

ご協力いただければ幸いです。

+2

なぜGROUP BYを使用していますか? – Dalen

+0

@Dalen私は何とかmedal_typeをグループ化する必要があるので、各タイプごとに1つのメダルしか表示されません。 – 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 
) 

私はあまりにも付け合わせるとしてこれを行うことが可能であるべきだと思うが、メダルの種類は、別のテーブルにあるの制限は、私の頭の痛みを作りました。おそらく、2つのテーブルを結合したビューがあれば、書く方が簡単でしょう。

+0

甘い!それは完全に動作しているようです!ありがとう。 :) – Spencer

0

"GROUP BY medal_type"があります。あなたのメダルの表はこの列の1,2の値しか持っていないので、結果に3 & 4を得ることはできません。

+0

私が望むのは、各medal_typeから1つのメダルだけを表示することです。たとえば、ユーザーに2つの「ポストメダル」がある場合、最新のものが表示されます。 – Spencer

0

メダルタイプでグループ化しているため、3と4が表示されません。だから3と4と1と2と同じタイプ。あなたがオフでグループを取る場合は、すべてのメダルを表示されます。

あなたはこのグループをしたいが、わずか3と4をしたいなら、あなたは単にあなたがメダルの種類によってグループ化しているので、それだけで、各タイプのいずれかを選択します

order by m.medal_type descending 
0

する必要があります。あなたが持っているすべてのメダルのリストが必要な場合、なぜメダルタイプでグループ化していますか?

おそらく、タイプごとに最高レベルのメダルを探していますか?そのような場合は、それを指定することができます。

0

ダレンは正しいことを尋ねました。なぜGROUP BYを最初に使用したいのですか?これはこのクエリでは必要ありません。 GROUP BYは別の目的を果たします。おそらく、あなたはthis oneのような例をチェックすることによってそれをもっと理解することができます。

関連する問題