我需要通过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.
其他信息: 我只想从每个奖牌类型中显示一枚奖牌。因此,举例来说,如果用户已经获得了两枚“后奖牌”,则只会显示最新获得的奖牌,以及所获得的任何其他奖牌。
非常感谢任何帮助。
答案 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这样的例子来理解它。