Я сделал запрос sql для конкретной необходимости, но я не профессионал SQL, поэтому мне нужна помощь, чтобы «улучшить» запрос.оптимизация sql-запроса обновление зависит от другой таблицы
Во-первых, у меня есть 3 таблицы:
- пользователя (идентификатор, имя пользователя, ...)
- действие (идентификатор, точка, limitPerDay)
- история (идентификатор, user_id, action_id, created_at , is_used_for_score)
Каждый раз, когда пользователь может делать определенное действие, это журнал в таблице истории (is_used_for_score будет истинным или ложным, если предел достигнут или нет)
Но мне нужно запросить обновление всех is_used_for_score, потому что при определенных условиях is_used_for_score можно перейти от ложного к истине
Мой запрос на самом деле
SET @num := 0, @user_id := 0, @type := '', @date := '';
UPDATE history SET is_used_for_score = 1 WHERE history.id IN (
SELECT history_id FROM (
SELECT
history.id AS history_id,
action.limitPerDay AS limit_per_day,
action.point,
@num := IF(
@type = action_id,
IF(
@date = CONCAT(YEAR(history.created_at), '-', MONTH(history.created_at), '-', DAY(history.created_at)),
IF (
@user_id = user_id,
@num + 1,
1
),
1
),
1
) AS row_number,
@user_id := user_id AS user_id,
@type := action_id AS action_id,
@date := CONCAT(YEAR(history.created_at), '-', MONTH(history.created_at), '-', DAY(history.created_at)) AS `date`
FROM history
LEFT JOIN `action` ON action.id = action_id
HAVING (row_number <= limit_per_day) OR (limit_per_day IS NULL)
ORDER BY history.created_at ASC, user_id, action_id
) AS history_id_count_for_vote
);
Но, я уверен, что, вероятно, не самый лучший способ для этого. У вас есть какое-то предложение, которое может улучшить запрос?
Спасибо
Невозможно пробиться через это. В любом случае, удачи. – Strawberry
Опишите, на английском, как нужно вычислять 'is_used_for_score'. –