【问题标题】:Issue Outputting Most Experienced Value问题输出最有经验的价值
【发布时间】:2019-07-13 11:29:22
【问题描述】:

全新的 SQL。

我正在尝试输出 2018 年用户最常用的应用程序。版本:MySQL v5.7

关系:

  • user(UID: INT PRIMARY KEY, UNAME VARCHAR(100), LOCATION VARCHAR(100))
  • 应用程序(AID:INT PRIMARY KEY,DID:INT NOT NULL,AppName VARCHAR(100),versionDate DATE)
  • usageHistory(AID:INT NOT NULL,UID:INT NOT NULL,usageDate DATE NOT NULL)

我当前的尝试是抛出 Invalid Use of Group Function 异常

SELECT user.UID, application.AID
FROM user
INNER JOIN usageHistory ON usageHistory.UID = user.UID
INNER JOIN application ON application.AID = usageHistory.AID
WHERE YEAR(usageHistory.usageDate) = 2018
GROUP BY user.UID
HAVING MAX(COUNT(usageHistory.AID))

我想显示用户名 | 2018 年最常用的应用程序。
示例:

  • 史蒂夫·史密斯 |脸书
  • 简·史密斯 |推特

(管道纯粹用于可视化)

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    在 MySQL 8+ 中,你可以使用ROW_NUMBER():

    SELECT UID, AID
    FROM (SELECT uh.UID, uh.AID,
                 ROW_NUMBER() OVER (PARTITION BY uh.UID ORDER BY COUNT(*) DESC) as seqnum
          FROM usageHistory uh
          WHERE uh.usageDate >= '2018-01-01' AND uh.usageDate < '2019-01-01'
          GROUP BY u.UID, a.AID
         ) ua
    WHERE seqnum = 1;
    

    注意事项:

    • 无需加入usersapplications。你要的id在usageHistory
    • 尝试使用直接日期比较。这样可以更轻松地优化查询。
    • 表别名使查询更易于编写和阅读。

    【讨论】:

    • 如何在不加入应用程序的情况下访问应用程序的名称?我只从 usageHistory 中知道应用程序 ID 而不是名称
    • @StormsEdge 。 . .为此,您需要加入应用程序。但是,您的问题仅包括应用程序 ID。
    • 这是一个错字,我会纠正它。我想显示用户名而不是 ID。我的错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2019-10-29
    • 2021-11-12
    相关资源
    最近更新 更多