Коротка відповідь
juniorSELECT author_id, COUNT(*) AS books FROM books GROUP BY author_id ORDER BY books DESC LIMIT 3; Це підраховує кількість книг на автора, сортує за спаданням і обмежує результат трьома записами.
Повне пояснення
Що це і навіщо Запит повертає трьох авторів з найбільшою кількістю книг. Використовується, коли потрібен топ‑3 по кількості записів.
Ключові принципи
GROUP BYагрегує рядки за полемauthor_id.COUNT(*)підраховує кількість рядків у кожній групі.ORDER BY books DESCсортує результати за спаданням.LIMIT 3обмежує кількість рядків у відповіді.
Як працює
- Сканується таблиця
books. - Рядки групуються за
author_id. - Для кожної групи обчислюється
COUNT(*). - Отримані агрегатні значення сортуються у спадному порядку.
- Відбираються перші три рядки.
Практика й реалізація
- PostgreSQL, MySQL, SQLite підтримують синтаксис без змін.
- Якщо таблиця велика, створіть індекс
CREATE INDEX idx_books_author ON books(author_id);.
Тестування
-- Тест: перевірка, що результат містить 3 рядки
SELECT COUNT(*) FROM (
SELECT author_id FROM books GROUP BY author_id ORDER BY COUNT(*) DESC LIMIT 3
) AS t;
У Node.js з Prisma:
const topAuthors = await prisma.book.groupBy({
by: ['authorId'],
_count: { id: true },
orderBy: [{ _count: { id: 'desc' } }],
take: 3,
});
Оптимізація запитів
- Індекси на
author_idзменшують час сканування. - Якщо таблиця дуже велика, використовуйте
partial indexабо матеріалізований вид. - Для частих запитів можна кешувати результат у Redis.
Безпека
- Запит не містить користувацьких параметрів, тому ризик SQL‑ін’єкції мінімальний.
- Якщо
author_idприймається з зовнішнього джерела, використовуйте параметризовані запити.
Поради для співбесіди
- Поясніть, чому
GROUP BYпотрібен. - Згадайте про можливість використання
HAVING COUNT(*) > 10для фільтрації. - Підкресліть важливість індексів для продуктивності.