我针对特定需求进行了sql查询,但我不是SQL的专业人员,所以我需要帮助以及#34;改进"查询。
首先,我有3个表:
每次用户执行特定操作时,都是登录历史记录表(如果达到限制,则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
);
但是,我很确定这可能不是最好的方法。你有什么建议可以改善查询吗?
谢谢
答案 0 :(得分:1)
在这样的问题上,我一次又一次地无情地重复:SQL是一种宣言语言,不要忘记这一点(像你一样陷入强制性行为)!
这意味着,您将要定义,DECLARE您将要使用的集合 - 换句话说,告诉引擎您想要什么,让HOW自行决定。
这是基石。
因此,请尝试像这样思考:&#34;我需要更新一些记录[在...之下......某些条件is_used_for_score可以从false传递到true&#39;],所以让我们首先定义设置&#34;
这就是你在这里缺少的 - 所以请继续,定义这些条件并用它来更新你的问题,因为它是一个非常时间的人试图从你发布的那个烂摊子中提取它