MySQL:Group By Clause

时间:2011-08-17 20:29:23

标签: php mysql greatest-n-per-group

我需要通过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.

其他信息: 我只想从每个奖牌类型中显示一枚奖牌。因此,举例来说,如果用户已经获得了两枚“后奖牌”,则只会显示最新获得的奖牌,以及所获得的任何其他奖牌。

非常感谢任何帮助。

5 个答案:

答案 0 :(得分: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
  )

我认为应该可以将此作为一个子连接进行,但是奖牌类型的限制在另一张桌子上让我头疼。如果有两个表连在一起的视图可能会更容易编写。

答案 1 :(得分:0)

你有“GROUP BY medal_type”。由于您的奖牌表此列的值仅为1,2,因此您不会获得3&结果中有4个。

答案 2 :(得分:0)

它没有显示3和4,因为您按奖牌类型对其进行分组。所以3和4和1和2的类型相同。如果你采取分组关闭,它将显示每一枚奖牌。

如果你想要这个组,但只需要3和4.那么你只需要

order by m.medal_type descending

答案 3 :(得分:0)

由于您按奖牌类型进行分组,因此它只会选择每种类型中的一种。如果你想要一个用户获得的所有奖牌的清单,你为什么要按奖牌类型进行分组?

也许你正在寻找类型最高级别的奖牌?如果是这种情况,您可能需要指定。

答案 4 :(得分:0)

Dalen确实问过正确的事情 - 你为什么要首先使用GROUP BY?在此查询中不需要这样做。 GROUP BY服务于不同的目的;也许你可以通过查看像this one这样的例子来理解它。