/修改 噢,伙计,我很抱歉。我没有意识到我的解决方案基本上是正确的 - 我所遗漏的只是外部查询中的第二个ORDER BY。
我有两个表:一个带有徽章信息的徽章表,以及一个user_award表,其中包含有关用户徽章奖励的信息。我想获得X最近的奖项,并展示一个带有分页的活动小部件。
问题在于管理员可以同时为多个用户颁发徽章。这会在表user_award中为每个用户创建一条单独的记录,但所有记录都具有相同的日期时间值。在我的活动小部件中,我想在一个条目中将具有相同日期时间值的所有奖项分组,因此它将如下所示:
正如您所看到的,我不想仅仅获得最近的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
但这并不能归还我想要的东西。谁能指出我在这里做错了什么?提前谢谢。
答案 0 :(得分:0)
为什么不只是GROUP BY
然后ORDER BY
?无论如何LIMIT
与ORDER BY
一起使用:
SELECT b.image,
b.title,
a.badge_id,
GROUP_CONCAT(a.user_ssomail) AS ssomails,
a.`when`
FROM user_award AS a
INNER JOIN badge AS b
ON a.badge_id = b.id
GROUP BY a.`when`,
a.badge_id
ORDER BY a.`when` DESC
LIMIT x OFFSET y ;