我有用于分页的逻辑,它的工作原理非常好。这个问题是为了优化/改进我的工作方式。
我正在运行两个查询来获取结果集。第一个查询按限制和偏移量获取所有项目,第二个查询获取总计数。我需要这个总数来为表示层中的分页链接进行数学运算。
我想避免运行两个查询,并尽可能将它们合并为一个查询。
例如,如果数据库中有100个项目,并且我运行下面的查询,LimitStartIndex
为1,LimitStopIndex
为20,则查询应返回20个结果,计数为100我目前在两个单独的查询中实现这一点就好了,但我想再次在一个查询中完成它。
这是我当前的设置(使用Golang):
var items []*Item
err := r.db.Select(&items, `
SELECT item.*
FROM item
JOIN user
ON user.username = ?
JOIN user_item
ON user_item.item_id = item.id
AND user_item.user_id = user.id
ORDER BY item.id DESC
LIMIT ?,?
`, username, pagination.LimitStartIndex, pagination.LimitStopIndex)
if err != nil {
// ...
}
var total int
err = r.db.Get(&total, `
SELECT COUNT(*)
FROM item
JOIN user
ON user.username = ?
JOIN user_item
ON user_item.item_id = item.id
AND user_item.user_id = user.id
`, username)
if err != nil {
// ...
}
result := &domain.PaginationResult{
Items: items,
Total: total,
}
我试过这样的事情:
SELECT item.*, COUNT(DISTINCT item.id) AS _count
FROM item
JOIN user
ON user.username = ?
JOIN user_item
ON user_item.item_id = item.id
AND user_item.user_id = user.id
ORDER BY item.id DESC
LIMIT ?,?
但是我收到此错误:
错误1140:在没有GROUP BY的聚合查询中,表达式#1 SELECT列表包含nonaggregated column' mytable.item.id&#39 ;;这是 与sql_mode = only_full_group_by
不兼容