特定のニーズに合わせてSQLクエリを実行しましたが、SQLの専門家ではないため、クエリを「改善する」必要があります。最適化SQLクエリの更新は別のテーブルに依存する
まず、私は3つのテーブルがあります。
- ユーザー(ID、ユーザ名、...)
- アクション(ID、ポイント、limitPerDay)
- 歴史(ID、USER_ID、action_id、created_atとを、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
);
である。しかし、真
偽から渡すことができますので、私はすべてのis_used_for_score更新のためのクエリを必要とするが、おそらく最善の方法ではありませんそれをする。あなたはクエリを改善できるいくつかの提案がありましたか?
はこのような問題に
私はそれを見越しているわけではありません。とにかく幸運。 – Strawberry
'is_used_for_score'の計算方法を英語で説明してください。 –