2011-10-10 87 views
2

我有三個表簡單的文章應用:的MySQL與另一個表的計數查詢選擇

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 

在我的實際應用中,我加在文章表中的列的評論文章總數。在向系統添加新評論時更新此列。與此相關的問題是添加新評論時,文章表已被鎖定。在我的應用程序中,每分鐘都會添加很多評論。所以我試圖通過重寫SQL查詢來避免鎖定文章表。

下面是測試的一些數據:

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' 
); 

回答

3
SELECT a.title AS title, u.username AS username, count(c.id) as total_comments FROM articles a 
    LEFT JOIN comments c ON c.article_id = a.id 
    LEFT JOIN users u ON a.user_id = u.id 
GROUP BY a.id 
+1

的TOTAL_COMMENTS將包含鏈接到文章 –

+0

所有評論計數你的答案是正確的,但因爲沒有使用索引的查詢是很慢的。我不知道如何爲這個查詢選擇正確的索引。感謝 –

+0

在'comments.article_id','articles.user_id'上添加索引並查看它是否改進 –

2

如何這樣的事情,不能測試它現在所以它可能有錯誤。

SELECT a.title, u.username, COUNT(*) total_comments 
FROM article a 
    JOIN user u ON (u.id=a.user_id) 
    LEFT OUTER JOIN comment c ON (c.article_id=a.id) 
GROUP BY a.title, u.username 
+0

你會得到每對夫婦的標題/用戶名所有評論鏈接到與作者無關的所有評論都不確定它是否回答 –

+0

來自OP:「在着陸頁上,我想用作者名稱和文章評論總數顯示最新文章標題。」此查詢應檢索每篇文章/文章所有者的評論總數。 – phil

+0

謝謝但如果沒有評論文章,上面的查詢將不會選擇文章。 –

1

如果您嘗試這樣回答?

SELECT a.title AS title, 
      u.username AS username, 
      count(c.id) AS total_comments 
FROM articles a, comments c, users u 
WHERE a.user_id =u.id 
    And a.id=c.articles_id 
    And c.user_id = u.id 

或者與內語法

SELECT a.title AS title, 
      u.username AS username, 
      count(c.id) AS total_comments 
FROM articles a 
INNER JOIN comments c ON c.article_id = a.id 
              AND c.user_id=u.id 
INNER JOIN users u ON a.user_id = u.id 
GROUP BY a.id 
1
SELECT article.title AS title, COUNT( 'comment.id') AS total_comment, user.username AS username 
FROM article 
JOIN COMMENT ON comment.article_id = article.id 
JOIN user ON user.id = article.user_id 
GROUP BY article.id 
相關問題