【问题标题】:Different aggregate functions under one GROUP BY statement一个 GROUP BY 语句下的不同聚合函数
【发布时间】:2014-11-28 05:10:41
【问题描述】:

我有以下表格:

主题:

主题ID(PK), 用户 ID(FK), 标题, 创建日期

消息:

消息ID(PK), 主题ID(FK), 用户 ID(FK), 邮件正文, 创建日期

用户:

用户ID(PK), 用户名


我想在其他字段中选择最后一条消息的用户名、最后一条消息的发布日期以及主题中的消息数量。

我无法选择上次发布消息的用户名。到目前为止,我提出的最佳查询只选择最后发布消息的最后日期,而不是用户名。我应该在查询中添加什么?

SELECT Topics.title, Users.username, Topics.dateCreated, COUNT(Messages.messageID) as postsCount, MAX(Messages.datePosted) as lastPostedDate
    FROM Topics 
    JOIN Users ON Topics.userID = Users.userID 
    JOIN Messages ON Topics.topicID = Messages.topicID 
    GROUP BY Topics.topicID

【问题讨论】:

  • 您使用的是什么数据库管理系统? (解决方法不同)看起来像 MySQL
  • @Used_By_Already,MySQL。谢谢你的帮助。

标签: sql join group-by aggregate-functions


【解决方案1】:

解决办法是:

SELECT 
Topics.title
, Users.username
, Topics.dateCreated
, COUNT(Messages.messageID) as postsCount
, lastPost.lastPostUser
, lastPost.lastPostDate  
FROM Topics 
JOIN (
    SELECT 
    Max(Messages.datePosted) as lastPostDate
    , Users.username as lastPostUser
    , Users.userID FROM Topics
    JOIN Users ON Topics.userID = Users.userID 
    JOIN Messages ON Topics.topicID = Messages.topicID 
    GROUP BY Topics.topicID) lastPost
ON Topics.userID = lastPost.userID
JOIN Users ON Topics.userID = Users.userID 
JOIN Messages ON Topics.topicID = Messages.topicID 
GROUP BY Topics.topicID;

编写此类查询的一个好方法是将其细分为几个简单的查询并在最后合并它们。就我而言

SELECT 
Max(Messages.datePosted) as lastPostDate
, Users.username as lastPostUser
, Users.userID FROM Topics
JOIN Users ON Topics.userID = Users.userID 
JOIN Messages ON Topics.topicID = Messages.topicID 
GROUP BY Topics.topicID;

刚刚加入:

SELECT 
    Topics.title
    , Users.username
    , Topics.dateCreated
    , COUNT(Messages.messageID) as postsCount
    FROM Topics         
    JOIN Users ON Topics.userID = Users.userID 
    JOIN Messages ON Topics.topicID = Messages.topicID 
    GROUP BY Topics.topicID;

【讨论】:

    【解决方案2】:

    不完全确定您希望得到什么,但这可能会有所帮助:

    SELECT
          Topics.title
        , tuser.username            AS TopicUserName
        , MIN(Topics.dateCreated)   AS TopicDate
        , muser.username            AS MessageUserName
        , COUNT(Messages.messageID) AS postsCount
        , MIN(Messages.datePosted)  AS firstPostedDate
        , MAX(Messages.datePosted)  AS lastPostedDate
    FROM Messages
          JOIN Users muser
                      ON Messages.userID = Users.userID
          JOIN Topics
                      ON Topics.topicID = Messages.topicID
          JOIN Users tuser
                      ON Topics.userID = Users.userID
    GROUP BY
          Topics.title
        , tuser.username
        , muser.username
    ORDER BY
          lastPostedDate DESC
    LIMIT 0,1
    ;
    

    【讨论】:

    • 此查询仅选择创建主题的用户名。但我需要两个:创建主题的用户名和发布最后一条消息的用户名。无论如何,感谢您的宝贵时间。
    • 哈!我找到了解决方案。很快就会发布。
    • 哦,好吧,我还是修改了答案
    猜你喜欢
    • 2010-11-15
    • 2013-08-31
    • 2012-12-07
    • 2019-10-23
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-08-24
    相关资源
    最近更新 更多