私は3つのテーブルを持つ単純な記事アプリケーションを持っています:
article
id, title, body, user_id
comment
id, article_id, user_id, body
user
id, username
ランディングページに、最新の記事タイトルを著者名と記事の総コメント数とともに表示したい。主な問題は、記事のコメントの総数を取得する方法ですが、正しく取得できませんでした。次の出力が得られるはずです。
title username total_comments
article 2 user2 0
article 1 user1 2
私の実際のアプリケーションでは、記事へのコメントの合計数の列を記事テーブルに追加しました。この列は、新しいコメントがシステムに追加されると更新されます。これに関する問題は、新しいコメントが追加されると article テーブルがロックされることです。私のアプリケーションでは、毎分多くのコメントが追加されます。そのため、SQLクエリを書き直して article テーブルをロックしないようにしています。
テスト用のデータを次に示します。
CREATE TABLE `article` (
`id` INT NULL AUTO_INCREMENT PRIMARY KEY ,
`title` VARCHAR( 100 ) NULL ,
`body` LONGTEXT NULL ,
`user_id` INT NULL
) ENGINE = MYISAM ;
CREATE TABLE `comment` (
`id` INT NULL AUTO_INCREMENT PRIMARY KEY ,
`article_id` INT NULL ,
`user_id` INT NULL ,
`body` LONGTEXT NULL
) ENGINE = MYISAM ;
CREATE TABLE `user` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` VARCHAR( 50 ) NOT NULL
) ENGINE = MYISAM ;
INSERT INTO `test`.`user` (
`id` ,
`username`
)
VALUES (
NULL , 'user1'
), (
NULL , 'user2'
);
INSERT INTO `test`.`article` (
`id` ,
`title` ,
`body` ,
`user_id`
)
VALUES (
NULL , 'article 1', 'body article 1', '1'
), (
NULL , 'article 2', 'body article 2', '2'
);
INSERT INTO `test`.`comment` (
`id` ,
`article_id` ,
`user_id` ,
`body`
)
VALUES (
NULL , '1', '1', 'body comment to article 1'
), (
NULL , '1', '1', 'body comment to article 1'
);