Я работаю с users
, user_roles
и point_standards
. Пользователям необходимо набрать определенное количество баллов за определенный период в зависимости от того, какую роль они играют. Очки начисляются за курсы, пройденные в определенном году. Получение пользовательских баллов не является проблемой.
Для определенных баллов, которые должен набрать пользователь, определяются критерии. Они сделаны на 3 года и не могут перекрываться. См. пример ниже.
Это означает, что с 2018 по 2020 год пользователь с ролью, назначенной этим критериям, должен набрать 93 балла.
В 2018 году пользователь должен набрать 31 балл (93/3).
Проблема в том, что пользователь хочет проверить критерии за годы, соответствующие большему количеству критериев. Допустим, пользователь хочет проверить критерии в 2018, 2017 и 2016 годах. Это означает:
(93 / 3) + (50 / 3) + (50 / 3)
Если установить потолок этих сумм, это должно привести к критерию 65 баллов для 2018, 2017 и 2016 годов.
Что касается моего ожидаемого конечного результата, я хочу получить обзор со всеми пользователями и критериями для конкретных лет.
В приведенном ниже примере я пытаюсь получить критерии для одного пользователя за 2018, 2017 и 2016 годы.
SELECT `users`.first_name,
ps.points
FROM `users`
# Join the user roles table
INNER JOIN `user_roles`
ON `users`.`role_id` = `user_roles`.`id`
# Get the criteria for 2018, 2017 and 2016
LEFT JOIN (SELECT id, role_id, COALESCE(points / 3) AS points
FROM point_standards
WHERE 2018 BETWEEN YEAR(start_year) AND YEAR(end_year)
OR 2017 BETWEEN YEAR(start_year) AND YEAR(end_year)
OR 2016 BETWEEN YEAR(start_year) AND YEAR(end_year)) ps
ON (user_roles.id = ps.role_id)
WHERE users.id = 123
GROUP BY `users`.`id`, ps.id
ORDER BY `points_internal` DESC
Это приводит к 2 строкам с правильными критериями.
Ожидаемый результат
В этом случае он должен вернуть 3 строки. Это потому, что я хочу увидеть критерии 2018, 2017 и 2016 годов.
Затем я надеялся, что смогу суммировать points
этих трех строк для каждого пользователя.
Вопросы
- Почему он возвращает только 2 строки вместо 3? Я выбрал 3 года, чтобы посмотреть.
- Как я могу суммировать это количество строк, чтобы получить обзор всех пользователей?
LEFT JOIN
для каждого случая? 08.11.2018[42000][1055] Expression #4 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'ps.criteria' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
08.11.2018ps.points
в списке выбора наsum(ps.points)
и удалитеps.id
из предложенияGROUP BY
. 08.11.20184439.000046
, а также неправильное количество текущих пользовательских баллов... как это произошло? 08.11.2018