问题描述
因此,我正在使用论坛软件Xenforo,我需要有关SQL查询的帮助,该查询将定期执行。该论坛将有大约300-500个活跃用户。所以没有什么太大的。
目标:
除了属于某些xf_users
的用户之外,所有用户node_id 71
都需要订阅user_group_id
。
现在,用户可以退订论坛或更改notify_on
和send_alert
和send_email
字段。我不要那个。因此,如果用户“退订”,则需要再次添加。
唯一接受的更改是notify_on
也可能是“邮件”。
摘要:
-
如果用户不在带有
node_id 71
的表上,则用xf_forum_watch
将用户插入node_id 71
,notify_on
设置为“ thread”和send_alert
和send_email
设置为“ 1”。 -
如果存在带有
user_id
和node_id 71
的行,则将send_alert
和send_email
中的一个更新为“ 0”时将其更新为“ 1”。如果notify_on
为空:更新为“线程”。
我到目前为止所得到的:
我认为#1是触发因素。事实是,我从未编写过触发器,也不知道如何使用触发器解决问题。
想法2是在PHPMyAdmin中编写一个“事件”,该事件定期运行查询。
我得到了将所有合适的用户一次插入列表的代码,但是在更新列表方面遇到了问题。
我尝试使用ON DUPLICATE KEY UPDATE
...,但没有按预期工作。
我的快速,肮脏的解决方案是删除node_id 71
的所有行,并在下面的查询中重新添加所有行,但这不允许用户选择notify_on
“消息”。还有
有帮助吗? ♥
表格:
(!!表中还将包含与其他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