0

/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

但这并没有返回我想要的。谁能指出我在这里做错了什么?提前致谢。

4

1 回答 1

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 ;
于 2013-01-03T11:46:32.607 回答