【发布时间】:2021-02-05 05:53:16
【问题描述】:
我正在尝试找出在一个查询中返回帖子和用户帖子总数的适当方式。
-
因此,计算用户帖子总数的最简单方法是:
SELECT COUNT(id) as total FROM posts WHERE uID = 37; +-------+ | total | +-------+ | 10 | +-------+ -
接下来,我更改了查询以返回帖子的 ID,并将总结果限制为前 5 个帖子。但是 MySQL 抛出了 Error 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 子句并且因为结果有 ' total' 字段在每一行中重复。
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 查询,一个用于用户的帖子,另一个用于总计,并使用服务器端的辅助函数连接两个响应?
你们有什么建议?我应该创建两个单独的调用来获得上面指定的结果,还是有更好的方法来改进我的查询?
【问题讨论】:
-
为什么不直接返回所有帖子然后计算应用程序中的帖子数量? (例如,在
fetch中,类似$count++或者如果您存储到一个数组,则计算一个数组)您的分组依据是您按记录ID而不是用户ID分组。如果您按用户 ID 分组,您将获得计数。您可以先执行count查询union检索帖子数据,但这似乎没有用。 -
JSON_ARRAYAGG(JSON_OBJECT('id', id)) -
@user3783243 我认为仅出于计数原因返回所有帖子是不必要的,如果用户有太多帖子,它可能会使服务器过载。
-
你说你需要这些帖子,不是吗?
I'm trying to figure out the appropriate way of returning the posts如果您不需要这些帖子,而是一个可以简化的计数而不是是的。如果您需要每个帖子数据,但没有办法解决这个问题。
标签: mysql sql count subquery window-functions