2012-04-29 70 views
2

我已經USERS表包含以下字段_idnamenumber_of_posts如何根據另一個表中的值更新數據庫記錄?

和我有POSTS TABLE包含以下字段_iduser_idpost_text

沒有usersposts之間的關係是one- to -many即,一個用戶有許多後

問題是如何更新number_of_postsusers臺,使得其將持有posts

UPDATE

後的號碼,我有這些表充滿了大約上百條記錄就沒有辦法使用觸發器來更新number_of_posts。

+0

+1好日常問題 – 2012-04-29 14:44:37

+0

如何?我是新手 – user4o01 2012-04-29 14:48:45

回答

1

你可以使用posts表上的觸發器來做到這一點。每次插入帖子時,都要更新users表中的number_of_posts。

http://dev.mysql.com/doc/refman/5.6/en/triggers.html

更新:充分合作解決方案

drop table if exists users; 
create table users ( 
    _id bigint unsigned auto_increment primary key, 
    name varchar(50) not null, 
    number_of_posts integer not null default 0 
); 

drop table if exists posts; 
create table posts ( 
    _id bigint unsigned auto_increment primary key, 
    user_id bigint unsigned not null, 
    post_text text 
); 

-- Populate with dummy data 
insert into users (name) values ('Bob'), ('Sally'); 
insert into posts (user_id, post_text) 
    values (1, 'First!!'), (1, 'Second...'), 
      (2, 'Post 1'), (2, 'another post'), (2, 'more posts'); 

-- One-time update of users table 
update users u 
set u.number_of_posts = (  
    select count(0) from posts p 
    where u._id = p.user_id  
); 

-- trigger to keep post count up to date when future posts are made 
drop trigger if exists trg_post_count; 
delimiter $$ 

create trigger trg_post_count 
after insert on posts 
for each row 
begin 
    select count(0) into @post_count 
    from posts 
    where user_id = NEW.user_id; 

    update users 
    set number_of_posts = @post_count 
    where _id = NEW.user_id; 
end; 
$$ 

delimiter ; 

-- test trigger 
insert into posts (user_id) values (2); 
select * from users; 
+0

+1在MySQL中練習使用觸發器 – 2012-04-29 14:44:08

+0

查看我的更新 – user4o01 2012-04-29 14:46:16

+0

count(0)是做什麼的? – user4o01 2012-04-29 16:23:48

1

作爲一個時間更新,試試這個,但是觸發的解決方案是要保持它當前是正確的:

UPDATE users AS u SET u.number_of posts = (SELECT COUNT(*) FROM posts AS p WHERE p.user_id=u.user_id) 
+0

+1爲漂亮的解決方案 – user4o01 2012-04-29 15:05:58

0

正如dwurf所建議的那樣,我肯定會推薦將其置於觸發器中以保持該字段最新。但是,我完全不同意他說,它應該只是一個你在每次更新時增加的數字。這是脆弱的和容易出錯的。你應該使用下面的查詢找出每個用戶到底有多少職位有:

update 
    users 
set 
    number_of_posts = ( 
    select 
     count(0) 
    from 
     posts p 
    where 
     p.user_id = users.id 
    ) 
; 
+1

同意不增加,我已經更新了我的帖子 – dwurf 2012-04-29 15:16:51

2

下面給出的示例腳本演示如何使用LEFT OUTER JOIN加入兩個usersposts表來獲取與用戶相關聯的帖子的數量和然後在用戶表中的* _id *字段上使用GROUP BY來獲取帖子數。

Click here to view the sample in SQL Fiddle.

查詢:

CREATE TABLE users 
(
    _id  INT NOT NULL 
    , name VARCHAR(30) NOT NULL 
); 

CREATE TABLE posts 
(
    _id  INT NOT NULL 
    , _userid INT NOT NULL 
    , name VARCHAR(30) NOT NULL 
); 

INSERT INTO users (_id, name) VALUES 
    (1, 'user 1'), 
    (2, 'user 2'), 
    (3, 'user 3'); 

INSERT INTO posts (_id, _userid, name) VALUES 
    (1, 1, 'post 1'), 
    (2, 1, 'post 2'), 
    (3, 2, 'post 3'); 

SELECT   u._id 
      , u.name 
      , COUNT(p._id) number_of_posts 
FROM   users u 
LEFT OUTER JOIN posts p 
ON    u._id = p._userid 
GROUP BY  u._id; 

輸出

_ID NAME NUMBER_OF_POSTS 
--- ------ --------------- 
1 user 1   2 
2 user 2   1 
3 user 3   0 
+0

+1 – user4o01 2012-04-29 15:05:51

相關問題