У меня есть логика, предназначенная для разбивки на страницы, и она работает отлично, как есть. Этот вопрос предназначен для оптимизации/улучшения в отношении того, как я что-то делаю.
Я запускаю два запроса, чтобы получить набор результатов. Первый запрос получает все элементы по лимиту и смещению, второй запрос получает общее количество. Мне нужна эта сумма, чтобы сделать математику для ссылок на страницы в слое презентации.
Я хочу избежать двух запросов и объединить их в один, если это возможно.
Например, если в базе данных есть 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 содержит неагрегированный столбец "mytable.item.id"; это несовместимо с sql_mode = only_full_group_by
Убедитесь, что в запросе добавлено "group by". Надеюсь это поможет. Благодарю.
SELECT item.*, COUNT(*) 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
GROUP BY item.id
ORDER BY item.id DESC
LIMIT ?, ?
LIMIT
. Посмотрите на второй запрос в первом примере кода, и вы поймете, что я имею в виду; он не используетLIMIT
.