mysql - 组已按日期排序结果

时间:2013-01-03 11:27:56

标签: mysql

/修改 噢,伙计,我很抱歉。我没有意识到我的解决方案基本上是正确的 - 我所遗漏的只是外部查询中的第二个ORDER BY。


我有两个表:一个带有徽章信息的徽章表,以及一个user_award表,其中包含有关用户徽章奖励的信息。我想获得X最近的奖项,并展示一个带有分页的活动小部件。

问题在于管理员可以同时为多个用户颁发徽章。这会在表user_award中为每个用户创建一条单独的记录,但所有记录都具有相同的日期时间值。在我的活动小部件中,我想在一个条目中将具有相同日期时间值的所有奖项分组,因此它将如下所示:

  • Bob和Mary收到了“First in Line”徽章。
  • Carlos收到了“Night Owl”徽章。
  • Jaime和Oliver获得了“Kitchen Master”徽章
  • Neill收到了“Already Up?”的徽章。
  • Bruce和Sylvester收到了“Mortal Enemies”徽章。

正如您所看到的,我不想仅仅获得最近的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

但这并不能归还我想要的东西。谁能指出我在这里做错了什么?提前谢谢。

1 个答案:

答案 0 :(得分:0)

为什么不只是GROUP BY然后ORDER BY?无论如何LIMITORDER 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 ;