Получить список результатов и получить сумму в одном запросе

0

У меня есть логика, предназначенная для разбивки на страницы, и она работает отлично, как есть. Этот вопрос предназначен для оптимизации/улучшения в отношении того, как я что-то делаю.

Я запускаю два запроса, чтобы получить набор результатов. Первый запрос получает все элементы по лимиту и смещению, второй запрос получает общее количество. Мне нужна эта сумма, чтобы сделать математику для ссылок на страницы в слое презентации.

Я хочу избежать двух запросов и объединить их в один, если это возможно.

Например, если в базе данных есть 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

  • 0
    Не отвечая здесь, но вы уверены, что было бы лучше рассчитывать на прикладном уровне?
  • 0
    Я хочу получить количество всех элементов для данного запроса, а не только количество результатов, возвращаемых с LIMIT . Посмотрите на второй запрос в первом примере кода, и вы поймете, что я имею в виду; он не использует LIMIT .
Показать ещё 6 комментариев
Теги:
go

1 ответ

1
Лучший ответ

Убедитесь, что в запросе добавлено "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 ?, ?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню