优化sql查询更新依赖于另一个表

时间:2017-02-07 22:43:19

标签: mysql sql optimization

我针对特定需求进行了sql查询,但我不是SQL的专业人员,所以我需要帮助以及#34;改进"查询。

首先,我有3个表:

  • user(id,username,...)
  • action(id,point,limitPerDay)
  • 历史记录(id,user_id,action_id,created_at,is_used_for_score)

每次用户执行特定操作时,都是登录历史记录表(如果达到限制,则is_used_for_score将为true或false)

但我需要查询更新所有is_used_for_score,因为在某些条件下is_used_for_score可以从false传递给true

我的查询实际上是

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
);

但是,我很确定这可能不是最好的方法。你有什么建议可以改善查询吗?

谢谢

1 个答案:

答案 0 :(得分:1)

在这样的问题上,我一次又一次地无情地重复:SQL是一种宣言语言,不要忘记这一点(像你一样陷入强制性行为)!

这意味着,您将要定义,DECLARE您将要使用的集合 - 换句话说,告诉引擎您想要什么,让HOW自行决定。

这是基石。

因此,请尝试像这样思考:&#34;我需要更新一些记录[在...之下......某些条件is_used_for_score可以从false传递到true&#39;],所以让我们首先定义设置&#34;

这就是你在这里缺少的 - 所以请继续,定义这些条件并用它来更新你的问题,因为它是一个非常时间的人试图从你发布的那个烂摊子中提取它