我有一个包含10行和cols的表“新闻”(uid,id,registered_users,....)现在我有用户可以登录我的网站(每个注册用户都有一个用户ID)。用户可以在我的网站上订阅新闻。
在SQL中意味着:我需要选择表“news”和带有uid的行(来自新闻)并将用户ID(来自当前用户)插入到“registered_users”列中。
INSERT INTO news (registered_users)
VALUES (user_id)
INSERT语句没有WHERE子句所以我需要UPDATE子句。
UPDATE news
SET registered_users=user_id
WHERE uid=post_news_uid
但如果有多个用户订阅相同的新闻,则“registered_users”中的旧用户ID将丢失....
有没有办法在sql UPDATE语句之后保留当前值?
我使用PHP(mysql)。目标是:
答案 0 :(得分:2)
听起来您要求插入新用户,以便更改news
中的行:
5 22,33
然后用户45注册,你得到:
5 22,33,45
如果我不明白,请告诉我。这个解决方案的其余部分是对这种方法的侮辱。
这是存储数据的坏,坏,坏方法。关系数据库是围绕具有行和列的表设计的。列表应表示为表中的多行,而不表示为字符串连接值。当你有一个整数id并且数据结构必须将整数转换为字符串时,情况就更糟了。
正确的方法是引入一个表格,例如NewsUsers
,例如:
create table NewsUsers (
NewsUserId int identity(1, 1) primary key,
NewsId int not null,
UserId int not null,
CreatedAt datetime default getdaete(),
CreatedBy varchar(255) default sysname
);
我使用SQL Server显示了这种语法。列NewsUserId
是此表的自动递增主键。列NewsId
是新闻项(第一个示例中为5
)。列UserId
是注册的用户ID。列CreatedAt
和CreatedBy
是我放在几乎所有表格中的便捷列。
使用此结构,您可以通过执行以下操作来处理问题:
insert into NewsUsers
select 5, <userid>;
答案 1 :(得分:1)
听起来您想要使用SELECT语句INSERT - INSERT with SELECT
示例:
INSERT INTO tbl_temp2 (fld_id)
SELECT tbl_temp1.fld_order_id
FROM tbl_temp1
WHERE tbl_temp1.fld_order_id > 100;
答案 2 :(得分:1)
您应该创建一个附加表来将用户映射到他们已注册的新闻 像:
create table user_news (user_id int, news_id int);
看起来像
----------------
| News | Users|
----------------
| 5 | 22 |
| 5 | 33 |
| 5 | 45 |
| 7 | 21 |
| ... | ... |
----------------
然后,您可以使用多个查询来首先检索news_id和user_id,并根据您使用的语言将它们存储在变量中,然后将它们插入到user_news中。
优点是,找到新闻的所有用户要快得多,因为你不必解析每一个idstring“(22,33,45)”