Если вы используете Oracle, Microsoft SQL Server, DB2 или PostgreSQL, эти базы данных поддерживают функции управления окнами.Присоедините ответы пользователя к другим ответам на тот же вопрос.Затем разделить по вопросу и отсортировать по убыванию.Используйте номер строки в каждом разделе, чтобы ограничить набор теми, которые находятся в топ-10. Также передайте user_id данного пользователя, чтобы вы могли выбрать их из топ-10, поскольку вас интересуют только ответы данного пользователя.
SELECT *
FROM (
SELECT r1.user_id AS given_user, r2.*,
ROW_NUMBER() OVER (PARTITION BY r2.question_id ORDER BY r2.total_score DESC) AS rownum
FROM Responses r1 JOIN Responses r2 ON r1.question_id = r2.question_id
WHERE r1.user_id = ?
) t
WHERE rownum <= 10 AND user_id = given_user;
Однако, если вы используете MySQL или SQLite или другие базы данных, которые не поддерживают оконные функции, вы можете использовать это другое решение:
Запросить ответы пользователя и использоватьприсоединиться, чтобы сопоставить другие ответы на соответствующие вопросы с большей оценкой (или более ранним PK в случае связей).Сгруппируйте вопрос и подсчитайте количество ответов с более высоким баллом.Если число меньше 10, то ответ пользователя входит в число 10 лучших вопросов.
SELECT r1.*
FROM Responses r1
LEFT OUTER JOIN Responses r2 ON r1.question_id = r2.question_id
AND (r1.total_score < r2.total_score
OR r1.total_score = r2.total_score AND r1.response_id > r2.response_id)
WHERE r1.user_id = ?
GROUP BY r1.question_id
HAVING COUNT(*) < 10;