mysql - MySQL 5.7.24 COUNT() 不能与 sql_mode=only_full_group_by 一起正常工作
问题描述
我试图找出在一个查询中返回帖子和用户帖子总数的适当方式。
因此,计算用户帖子总数的最简单方法是:
SELECT COUNT(id) as total FROM posts WHERE uID = 37; +-------+ | total | +-------+ | 10 | +-------+
接下来,我更改了查询以返回帖子的 ID,并将总结果限制为前 5 个帖子。但是 MySQL 抛出错误 1140 ......
SELECT id, COUNT(id) as total FROM posts WHERE uID = 37 LIMIT 0,5; Error Code: 1140. In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'db.posts.id'; this is incompatible with sql_mode=only_full_group_by
好的,没有难过的感觉...我不打算更改默认的“sql_mode”,所以我
GROUP BY
按照建议通过将子句添加到查询中来修复上述错误,但现在该COUNT()
函数没有多大意义,因为它为每个结果返回 1... 嗯SELECT id, COUNT(id) as total FROM posts WHERE uID = 37 GROUP BY id LIMIT 0,5; +----+-------+ | id | total | +------------+ | 1 | 1 | +----+-------+ | 2 | 1 | +----+-------+ | 3 | 1 | +----+-------+ | 4 | 1 | +----+-------+ | 5 | 1 | +----+-------+
好吧,然后我为帖子添加了一个 JOIN 子句,这样我就可以计算用户的帖子,但是我对查询不是很满意,因为附加的 JOIN 子句并且因为结果具有“总计”字段在每一行重复。
SELECT id, userPosts.total as total FROM posts JOIN (SELECT COUNT(*) AS total FROM posts WHERE uID = 37) AS userPosts WHERE uID = 37 GROUP BY id, userPosts.total LIMIT 0,5; +----+-------+ | id | total | +------------+ | 1 | 10 | +----+-------+ | 2 | 10 | +----+-------+ | 3 | 10 | +----+-------+ | 4 | 10 | +----+-------+ | 5 | 10 | +----+-------+
所以我在想自己.. 必须有一种更好的方法来返回帖子和用户在一个查询中的帖子总数,所以 MySQL 结果对象看起来像这样:(total
在每个帖子对象中没有) 但我找不到任何方法。
{
results: [
{
id: 1
}, {
id: 2
}, {
id: 3
}, {
id: 4
}, {
id: 5
}
],
total: 10
}
也许我应该创建两个单独的 MySQL 查询,一个用于用户的帖子,另一个用于总计,并使用服务器端的辅助函数连接两个响应?
你们有什么建议?我应该创建两个单独的调用来获得上面指定的结果,还是有更好的方法来改进我的查询?
解决方案
您正在描述窗口计数。在 MySQL 8.0 中,你会这样做:
select id, count(*) over() as total
from posts
where uid = 37
如果您运行的是早期版本,那么[cross] join
就可以了。您也可以使用相关子查询来表达这一点 - 但逻辑是相同的:
select id, (select count(*) from posts p1 where p1.uid = p.uid) as total
from posts p
where uid = 37
推荐阅读
- java - 在while循环java中跳过迭代
- apache - ExtractHL7Attributes NiFi Processor
- azure - AppRoleAssignments Errors With Null
- asp.net-core - IdentityServer4 losing original returnUrl when using External Login server
- c - how to use scanf to read an integer from the command line
- python-3.x - Tkinter 创作
- python - 使用 videomixer 在循环内创建 gstreamer uridecodebin 元素
- azure - 使用存储在 Azure Key Vault 中的证书对服务主体进行身份验证
- python - 将新索引添加到 MultiIndex 数据框 pandas 的特定级别
- python - PyPDF3 合并限制解决方法