Есть три таблицы test, которая содержит список тестов, user, в которой содержится список пользователей, и testuser, в которой есть ид теста и юзера и балл, полученный за тест.
Необходимо вывести user.name, общее количество тестов, количество тестов, которые прошёл юзер, и сумма баллов. У меня получился вот такой запрос:
SELECT u.name, COUNT(*), SUM(tu.grade), (SELECT COUNT(*) FROM test)
FROM test t
LEFT JOIN testuser tu ON tu.test_id = t.id
INNER JOIN uset u ON u.id = tu.user_id
WHERE u.name IS NOT NULL
GROUP BY u.name
Но это решение мне не нравится, т.к. если надо вывести такую же таблицу отдельно по категориям тестов, то надо будет дублировать условие категории в основной запрос и в подзапрос количества тестов, а если категоризация тестов станет сложнее и надо будет джойнить таблицы, то тогда получится два очень больших одинаковых куска, что на мой взгляд не совсем правильно и красиво. Есть ли какой-нибудь вариант более красивого решения?