2009-08-25 5 views
0

MySQLに関して何か不足している可能性があります。Mysql - カラムを使用してカウントを保存する

私は列に「カウント」を格納する方法を見つけようとしています。 手動で更新することなく動的に更新する必要があります。

メンバーがコンテンツを作成または削除するたびに、1をカウントに追加または削除したくありません。 contentcountのフィールドは、このメンバーが所有するすべてのコンテンツのカウントでなければなりません。

create table content 
(
    id_content   int not null auto_increment, 
    id_member   int not null, 
    primary key (id_content) 
); 

create table member 
(
    id_member   int not null auto_increment, 
    contentcount   ???????????????, 
    primary key (id_member) 
); 

alter table content add constraint fk_member_content foreign key (id_member) 
     references member (id_member) on delete cascade on update cascade; 

どうすればこの問題を解決できますか? ありがとうございました。

答えて

3

テーブルにフィールドにアクセスするには、カウントをフィールドとして格納する必要はありません。あなたはFIELD_NAMEが含まれている場合、いくつかのNULLは、これらのカウントに寄与しない値なので、そのような主キーとしてnull値を(含まれていません列を使用するのが最善だと

SELECT COUNT(field_name) FROM table_name; 

注意を使用していつでもアクセスすることができますまたは他のインデックスフィールド)

+0

合意...テーブルを照会するのではなく、実際にカウントを格納する必要がある特定の理由はありますか? – Evernoob

1

これは、アフターインサートとアフター削除トリガーでのみ達成できると思います。アフターインサートでは、contentcount列をインクリメントします。削除後は減分します。

1
CREATE TRIGGER teh_counter AFTER INSERT ON content 
FOR EACH ROW 
BEGIN 
update member set contentcount=(contentcount+1) where id_member=NEW.id_member; 
END; 
1

実際にデータベースに格納したい場合は、トリガーを使用します。しかし、これを保存することは不必要に(複雑さを増やす)、それを格納しないよりもおそらく遅くなります。コンテンツのmember_id列にインデックスを追加するだけです。

は、次に使用:

SELECT COUNT(*) FROM content WHERE member_id = ? 

必要な場合は、そのコンテンツの数によって、複数のメンバーと順序を選択することも非常に簡単です。

は、私は、AUTO_INCREMENTを持つテーブルを作成し、それに行を挿入する
0

は、その挿入が生成した値を取得するためにlast_insert_id()機能を使用し、それが

0

私はcontentcountを保存したい保存するため、I Propelによって生成されたFlex AS3とPHPクラス間のPropel/AMFPHPとクラスマッピングを使用しています。

更新/削除のトリガーは私の解決策です。私は前にトリガーを使わなかったので、私は学びます。

ありがとうございました。私はあなたがとても素早く答えたことに感心しています!

+0

トリガーを入れるだけです。それはうまくいっている! もう一度おねがいします! – Thommas

関連する問題