相关问题: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/