/edit 哦,伙计们,我很抱歉。我没有意识到我的解决方案基本上是正确的——我所缺少的只是外部查询中的第二个 ORDER BY。
我有两个表:一个包含徽章信息的徽章表,以及一个包含用户徽章奖励信息的 user_award 表。我想获得 X 最近的奖项并显示一个带有分页的活动小部件。
问题是管理员可以同时向多个用户授予徽章。这会在表 user_award 中为每个用户创建一个单独的记录,但所有记录都具有相同的日期时间值。在我的活动小部件中,我想将具有相同日期时间值的所有奖项分组到一个条目中,因此它的内容如下:
- Bob 和 Mary 获得了“First in Line”徽章。
- 卡洛斯获得了“夜猫子”徽章。
- Jaime 和 Oliver 获得了“厨房大师”徽章
- 尼尔收到了“Already Up?”的徽章。
- 布鲁斯和西尔维斯特获得了“致命敌人”徽章。
如您所见,我不想要最近的 5 个获奖作品,而是按日期对最近的获奖作品进行分组。
我的架构的相关部分如下:
user_award
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user_ssomail | varchar(64) | NO | | NULL | |
| badge_id | int(11) | NO | MUL | NULL | |
| when | datetime | YES | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
badge
+-------------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| title | varchar(45) | NO | | NULL | |
| description | text | NO | | NULL | |
| image | varchar(120) | NO | | NULL | |
+-------------------------+--------------+------+-----+---------+----------------+
user_award 表的样本数据:
*************************** 13. row ***************************
user_ssomail: aaa
badge_id: 7
when: 2013-01-02 18:29:16
*************************** 14. row ***************************
user_ssomail: bbb
badge_id: 4
when: 2013-01-02 19:07:15
*************************** 15. row ***************************
user_ssomail: ccc
badge_id: 4
when: 2013-01-02 19:07:15
我想要达到的结果是:
***result 1***
user_ssomails: bbb, ccc
badge_id: 4
when: 2013-01-02 19:07:15
***result 2***
user_ssomails: aaa
badge_id: 7
when: 2013-01-02 18:29:16
请注意,具有相同日期时间的奖励会被分组,并连接 user_ssomails。
从我目前了解到的情况来看,GROUP 操作发生在 SORT 操作之前,所以我尝试了一个复合查询。内部查询选择所有 user_awards 并按日期对其进行排序:
SELECT badge.image,
badge.title,
user_award.badge_id,
user_award.user_ssomail,
user_award.when
FROM user_award
INNER JOIN badge ON user_award.badge_id = badge.id
ORDER BY user_award.when DESC
外部查询按日期时间字段对结果进行分组:
SELECT sorted_awards.image,
sorted_awards.title,
sorted_awards.badge_id,
GROUP_CONCAT(sorted_awards.user_ssomail) AS ssomails,
sorted_awards.when
FROM
(SELECT badge.image,
badge.title,
user_award.badge_id,
user_award.user_ssomail,
user_award.when
FROM user_award
INNER JOIN badge ON user_award.badge_id = badge.id
ORDER BY user_award.when DESC) AS sorted_awards
GROUP BY sorted_awards.when LIMIT :bottom_limit,
:upper_limit
但这并没有返回我想要的。谁能指出我在这里做错了什么?提前致谢。