2013-06-05 33 views
0

我有一個包含10行和列(uid,id,registered_users,....)的「新聞」表現在我有可以登錄到我的網站的用戶(每個註冊用戶都有一個用戶ID)。用戶可以在我的網站上訂閱新聞。SQL - 使用UPDATE語句保留值

在SQL中,這意味着:我需要選擇表「news」和帶有uid的行(來自新聞),並將用戶標識(從當前用戶)插入到「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
+0

創建一個審計表。 –

+0

是的,registered_users是逗號分隔的文本字符串。 – Jim

回答

1

您應該創建一個額外的表給用戶映射到的消息,他們對 像registeres:

create table user_news (user_id int, news_id int); 

,看起來像

---------------- 
| News | Users| 
---------------- 
| 5  | 22 | 
| 5  | 33 | 
| 5  | 45 | 
| 7  | 21 | 
| ... | ... | 
---------------- 

然後你可以使用多個查詢t o首先檢索news_id和user_id,並根據您使用的語言將它們存儲在變量中,然後將它們插入到user_news中。

的優點是,要找到一條新聞的所有用戶的速度要快得多,因爲你不必解析每一個idstring「(22,33,45)」

1

這聽起來像你想使用INSERT SELECT語句 - 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; 
+0

這裏有一個問題......我如何在此聲明中插入我的價值? tbl_temp2是表和fld_id是列,但其中的值部分? – Jim

+0

沒有VALUE()部分,您只需編寫一個查詢來返回所有要插入的值。您可以按照它們在表格中出現的順序選擇字段,也可以指定要插入的字段,在上面的示例中,它們僅插入到(fld_id)字段中。 –

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是註冊的用戶標識。列表CreatedAtCreatedBy是我放在幾乎所有表格中的方便列。

通過這樣的結構,你會做處理您的問題:

insert into NewsUsers 
    select 5, <userid>; 
+0

你明白它是正確的:)它可以從5 |更改22,33至5 | 22,33,45 – Jim