0

我有一个包含 10 行和列(uid、id、registered_users ......)的表“新闻”现在我有可以登录到我的网站的用户(每个注册用户都有一个用户 id)。用户可以在我的网站上订阅新闻。

在 SQL 中,这意味着:我需要选择表“新闻”和具有 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)列“注册用户”(22,33,45)
  • --- 3 个用户订阅了 uid 5 的新闻
  • 表“新闻”第 7 行(uid)列“注册用户”(21,39)
  • --- 2 个用户订阅了 uid 7 的新闻
4

3 回答 3

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>;
于 2013-06-05T13:46:34.860 回答
1

听起来你想用 SELECT 语句插入 - 用 SELECT 插入

例子:

 INSERT INTO tbl_temp2 (fld_id)
      SELECT tbl_temp1.fld_order_id
      FROM tbl_temp1 
      WHERE tbl_temp1.fld_order_id > 100;
于 2013-06-05T13:39:31.367 回答
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)"

于 2013-06-05T13:50:34.310 回答