我当前的表已注册了用户a,b,c,d,e,f。
然后我获得所有注册用户的完整列表,其中列出了c,d,e,f,g h。
这意味着a,b尚未注册,而g,h是新的注册用户。
注意*:没有事件告诉我用户何时注册或注销。我不想每天访问一次以上的所有注册用户的列表。
我当前更新MySQL的方法:
const PrivateRoute = (props) => {
const { component: Component, isLogged, ...rest } = props;
console.log('on est dans la route lol', isLogged, {...rest});
return (
<Route
{...rest}
render={propsRender =>
isLogged ? (
<Component {...propsRender} />
) : (
<Redirect
to={{
pathname: "/login",
state: { from: propsRender.location }
}}
/>
)
}
/>
);
};
PrivateRoute.propTypes = {
isLogged: PropTypes.bool,
};
export default PrivateRoute;
然后,我使用所有注册用户的新列表继续更新表:
UPDATE users SET registered = -1 WHERE registered = 1;
然后,我继续更新表,标记未注册的用户:
INSERT INTO users (id, registered) VALUES($userid[i], 1) ON DUPLICATE KEY UPDATE registered = 1;
基本上使用-1作为指示用户已注册的指示器,但根据完整列表,该标志不再存在;
这在一张小桌子上可以正常工作,但要花费数小时才能花费数万。
有更好的方法吗?
将其减少到几分钟是可以接受的。
答案 0 :(得分:1)
您可以像这样使用where in
UPDATE users set registered = 1 WHERE id in (implode($userid,','))
您将用户ID内爆
sql语句应如下所示
UPDATE users set registered = 1 WHERE id in (1,2,3,5)
编辑:这是mysql批处理插入的链接 How to do a batch insert in MySQL
答案 1 :(得分:1)
秘密在于扔掉令人讨厌的UPDATE
。
将registered
列设为某种DATETIME
,而不是标记。
现在测试在WHERE ts < NOW() - INTERVAL 1 DAY
上进行了-无需每天更改registered
!
对其中一项进行操作时,只需使用UPDATE ... ts = NOW() WHERE id = ...
对其进行更新。