MySQL查询,插入 表格:代码:

问题描述

因此,我正在使用论坛软件Xenforo,我需要有关SQL查询的帮助,该查询将定期执行。该论坛将有大约300-500个活跃用户。所以没有什么太大的。

目标:

除了属于某些xf_users用户之外,所有用户node_id 71都需要订阅user_group_id

现在,用户可以退订论坛或更改notify_onsend_alertsend_email字段。我不要那个。因此,如果用户“退订”,则需要再次添加

唯一接受的更改是notify_on也可能是“邮件”。

摘要

  • 如果用户不在带有node_id 71的表上,则用xf_forum_watch用户插入node_id 71notify_on设置为“ thread”和send_alertsend_email设置为“ 1”。

  • 如果存在带有user_idnode_id 71的行,则将send_alertsend_email中的一个更新为“ 0”时将其更新为“ 1”。如果notify_on为空:更新为“线程”。

我到目前为止所得到的:

我认为#1是触发因素。事实是,我从未编写过触发器,也不知道如何使用触发器解决问题。

想法2是在PHPMyAdmin中编写一个“事件”,该事件定期运行查询

我得到了将所有合适的用户一次插入列表的代码,但是在更新列表方面遇到了问题。

我尝试使用ON DUPLICATE KEY UPDATE ...,但没有按预期工作。

我的快速,肮脏的解决方案是删除node_id 71的所有行,并在下面的查询中重新添加所有行,但这不允许用户选择notify_on“消息”。还有

有帮助吗? ♥

表格:

Screenshot of the table

(!!表中还将包含与其他node_id不同的行。这些行必须保持不变!)

代码

insert into xf_forum_watch
    select user_id,"71" as node_id,"thread" as notify_on,"1" as send_alert,"1" as send_email
    from xf_user
where user_group_id NOT IN (1,18,40);

这会将正确的用户添加到列表中(请参见屏幕截图)。但是,如果用户已经订阅,它将引发错误


我希望我不会遗漏任何细节。如果仍有问题,请告诉我。

我感谢各种帮助。

PS:我希望我不会破坏格式。我不习惯在这里发布。


编辑:感谢@GMB的解决方案。

我有一个后续问题。我想将工作查询放入存储过程中,但这给我一个错误

DELIMITER $$

CREATE PROCEDURE forceSubscribetoNode(
    IN node_id_var INT
)
BEGIN
    insert into xf_forum_watch
    (user_id,node_id,notify_on,send_alert,send_email)
    select user_id,node_id_var as node_id,1 as send_alert,1 as send_email
    from xf_user
where user_group_id NOT IN (1,40)
on duplicate key update 
    send_alert = 1,send_email = 1,notify_on = case when notify_on is null or notify_on = '' then 'thread' else notify_on end
END $$

DELIMITER ;

错误

#1064 - You have an error in your sql Syntax; check the manual that corresponds to your MysqL server version for the right Syntax to use near 'END' at line 18

(第18行是“ send_email = 1”)

我在做什么错了?

解决方法

您可以在查询中添加on duplicate key

insert into xf_forum_watch
    (user_id,node_id,notify_on,send_alert,send_email)
    select user_id,71 as node_id,'thread' as on notify_on,1 as send_alert,1 as send_email
    from xf_user
where user_group_id NOT IN (1,18,40)
on duplicate key update 
    send_alert = 1,send_email = 1,notify_on = 'thread'

这假定您具有正确的主键设置,以便正确识别重复项。

如果您想在on duplicate key子句中使用条件逻辑,也可以这样做:

on duplicate key update 
    send_alert = case when send_alert = 0 then 1 else send_alert end,send_email = case when send_email = 0 then 1 else send_email end,notify_on = case when notify_on is null or notify_on = '' then  'thread' else notify_on end