MySQL выберите с запросом подсчета на другой таблице - PullRequest
2 голосов
/ 10 октября 2011

У меня есть простое приложение статьи с тремя таблицами:

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

Ответы [ 4 ]

3 голосов
/ 10 октября 2011
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
2 голосов
/ 10 октября 2011

Как насчет этого, не могу сейчас его протестировать, поэтому могут быть ошибки.

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
1 голос
/ 10 октября 2011
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
1 голос
/ 10 октября 2011

Если вы попробуете это, то оно ответит?

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
...