SQL - 使用UPDATE语句保留值

时间:2013-06-05 13:37:53

标签: sql sql-update sql-insert

我有一个包含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)。目标是:

  • 表“新闻”第5行(uid)栏目“registered_users”(22,33,45)
  • --- 3位用户使用uid 5
  • 订阅了新闻
  • 表“新闻”第7行(uid)栏“registered_users”(21,39)
  • --- 2位用户使用uid 7
  • 订阅了新闻

3 个答案:

答案 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。列CreatedAtCreatedBy是我放在几乎所有表格中的便捷列。

使用此结构,您可以通过执行以下操作来处理问题:

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)”