MySQL:包含多列的GROUP by

时间:2016-11-30 16:29:04

标签: mysql group-by

我正在尝试从表中获取多个值,其中GROUP BY仅针对其中一个列。为简化起见,我将使用模型留言簿表作为示例:

postNumber | user | text        | date | portal
-----------------------------------------------
 1 | Michael      | "nice blog" | 10/12| fitness
 2 | Ronald       | "hello!"    | 12/12| lounge
 1 | Michael      | "beautiful" | 05/11| pictures
 2 | Sandra       | "great pic" | 10/12| pictures

让我们假设留言板的首页必须打印最新的留言帖,但每个门户只有一个(健身,休息室和图片)。期望的结果将是:

  • 迈克尔/"好博客" / fitness
  • 罗纳德/"你好" /休息区
  • 和sandra /"伟大的照片" /图片。

被排除的帖子应该是Michael /" beautiful" / pictures,因为它不是该门户网站的最新版本。

以下查询对于更现代的mySQL服务器无效,抛出下述错误:

SELECT max(postNumber), user, text, date, portal FROM guestbook GROUP BY portal;
  

GROUP BY子句并包含nonaggregated column' database.table.columnName'它在功能上不依赖于GROUP BY子句中的列;这与sql_mode = only_full_group_by

不兼容

然而,下面这个更有限的查询有助于实现理想的结果,但它不能影响剩余的所需列(用户,文本,日期),这正是我遇到的问题:

SELECT max(postNumber), portal FROM guestbook GROUP BY portal;

应该注意的是,可以通过向GROUP BY添加用户,文本和日期来修复第一个查询,但是执行这样的复合分组将不再为每个门户检索一个条目。

如果有人能解决这个问题,请详细说明,因为我无法通过自己或在线研究找到方法。

编辑:我尝试了以下查询,没有结果,因为右边的JOIN给了我左表中的值(只有门户和帖子编号),不确定原因:

'SELECT t1.portal, max(t1.postNumber) from guestbook t1 RIGHT OUTER JOIN (SELECT * from guestbook) t2 on t1.postNumber = t2.postNumber GROUP BY portal LIMIT ?';

2 个答案:

答案 0 :(得分:1)

你走在正确的轨道上......做一个预查询作为你想要的记录的基础,然后在合格的日期条件下重新加入同一个原始表。

select
      PreQuery.Portal,
      PreQuery.LatestPostNumber,
      T2.User,
      T2.Text,
      T2.Date
   from
      ( select 
              t1.Portal,
              max( t1.PostNumber ) as LatestPostNumber
           from
              GuestBook T1
           group by 
              t1.Portal ) PreQuery
         JOIN GuestBook T2
            on PreQuery.Portal = T2.Portal
           AND PreQuery.PostNumber = T2.PostNumber

答案 1 :(得分:1)

请尝试以下查询

SELECT *
FROM (SELECT postNumber, 
             user, 
             text,
             date,
             @current_portal := portal,
             @portal_rank := IF(@current_portal = portal and @portal_rank = portal, @portal_rank + 1, 1) AS portal_rank,
      FROM guestbook
      ORDER BY portal, date DESC) ranked
WHERE portal_rank = 1)

使用portal_rank变量对门户进行排名,并按门户和日期desc排序。 这样,您只选择每个门户的最新记录

我认为这个查询更容易理解,而且当你可以使用变量时,不需要在单个表上进行多个连接。

此外,使用portal_rank切换条件portal_rank = 1可以说< = 3,每个门户网站可以获得3条最新记录,并且查询更改最少。

希望这会有所帮助。