相关问题:MySQL "Group By" and "Order By"

我可以使用以下查询来检索某项的下载列表:

SELECT items.id, items.name, users.fullName AS downloadedBy, dl.dateTime AS lastDownload
FROM items
    LEFT OUTER JOIN downloads dl ON dl.itemID = items.id
    LEFT JOIN users ON users.id = dl.userID
WHERE items.id = '47'
ORDER BY dl.dateTime DESC


如预期的那样,这将返回下载列表,其中最新列表位于顶部。

我想要做的是检索该项目的上次下载和下载总数。

该查询:

SELECT items.id, items.name, users.fullName AS downloadedBy, dl.dateTime AS lastDownload, COUNT(dl.id) AS total
FROM items
    LEFT OUTER JOIN downloads dl ON dl.itemID = items.id
    LEFT JOIN users ON users.id = dl.userID
WHERE items.id = '47'
ORDER BY dl.dateTime DESC
GROUP BY items.id


返回正确的总数,但是下载详细信息(用户名和日期)是列表中间的随机条目。如链接问题中所述,将主查询包装在子查询中,然后将GROUP BY放在后面,具有相同的效果。是否可以在一个查询中同时检索上次下载和总计?

我正在使用禁用ONLY_FULL_GROUP_BY的MySQL 5.7.21版。

[编辑]
回答Ankit的评论:

第一个查询的输出:

id |名称|已下载lastDownload
=============================================
47 |项目47 | Matilda | 2018-08-18 19:10
47 |项目47 |马尔马杜克| 2018-08-14 07:21
47 |项目47 |西蒙| 2018-06-11 14:02
47 |项目47 |鲍里斯| 2018-06-11 14:00


所需的输出:

id |名称|已下载最新下载|总
================================================== ====
47 |项目47 | Matilda | 2018-08-18 19:10 | 4


第二个查询的实际输出:

id |名称|已下载最新下载|总
================================================== ====
47 |项目47 |西蒙| 2018-06-11 14:02 | 4

最佳答案

您要查询的是具有独立逻辑的两个独立事物。上一次下载查询一行,而行数则计算行数,与上一次下载查询无关。

您的查询不起作用的原因是,聚合函数是根据每个常规列(id,name,fullName和dateTime)计算的。如果您未禁用ONLY_FULL_GROUP_BY,则将获得每个组合的计数。既然您已经做完了,MySQL将从这些结果集中选择随机值。禁用ONLY_FULL_GROUP_BY通常是一件坏事。它可以保护您避免错误使用GROUP BY。

要进行查询,您可以对您感兴趣的两件事分别进行查询,然后将它们组合为一个。

select max(id), max(name), max(downloadedBy), max(lastDownload), max(cnt)
from (
  (SELECT items.id, items.name, users.fullName AS downloadedBy, dl.dateTime AS lastDownload
  FROM items
      LEFT OUTER JOIN downloads dl ON dl.itemID = items.id
      LEFT JOIN users ON users.id = dl.userID
  WHERE items.id = '47'
  ORDER BY dl.dateTime DESC
  limit 1)
  union
  (select null, null, null, null, count(*)
  FROM items
      LEFT OUTER JOIN downloads dl ON dl.itemID = items.id
      LEFT JOIN users ON users.id = dl.userID
  WHERE items.id = '47')
) q;

关于mysql - MySQL-COUNT()个非聚集列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51911271/

10-16 04:10