Как найти количество комментариев и количество просмотров данной статьи в SQL ..? - PullRequest
1 голос
/ 09 февраля 2012

У меня есть 2 таблицы:

  • обзор (включая content_type_id , object_id )
  • комментарии (включая content_type_id , object_id )

Сочетание " content_type_id и object_id " однозначноопределяет сущность (например, статью и т. д.)


Теперь я хочу написать один SQL-запрос в:

"список всех статей с их 'review_count'и 'comment_count' ".

Я имею в виду в конечном результате, что я хочу:

content_type_id | object_id | review_count | comment_count

Как я могу добиться этого .. ??

Ответы [ 6 ]

2 голосов
/ 09 февраля 2012

(Отредактировано после изменения вопроса и Я обнаружил ошибку в данных)

Попробуйте это:

select 
    content_type_id, object_id,
    sum(review_count) review_count,
    sum(comment_count) comment_count
from
    (
        select 
            content_type_id, object_id, count(*) review_count 
        from jc_reviews 
        group by 1, 2
    ) as r_count
    full outer join 
    ( 
        select content_type_id, object_id, count(*) comment_count 
        from jc_comments 
        group by 1, 2
    ) as c_count
    using (content_type_id, object_id)
group by 1, 2

Не используется центральная таблица (ранееназывается article).Это означает, что элементы без комментариев и обзоров не будут отображаться в результате.Элементы, где есть хотя бы один комментарий или один отзыв, будут отображаться.

1 голос
/ 09 февраля 2012

попробуйте это:

SELECT  a.Article_ID,
        COUNT(b.Article_ID) as ReviewCount,
        COUNT(c.Article_ID) as CommentCount
FROM Articles a JOIN Review b ON
        a.Article_ID = b.Article_ID
    LEFT JOIN Comments c ON
        a.Article_ID = c.Article_ID
GROUP BY a.Article_ID
1 голос
/ 09 февраля 2012

Я бы начал с того, что придерживался согласованного соглашения об именах для моих таблиц и держал их все в единственном числе

SELECT article_id = a.article_id
       ,review_count = COUNT(DISTINCT(r.review_id))
       ,comment_count = COUNT(DISTINCT(c.comment_id))
  FROM article a
  LEFT OUTER JOIN review r
    ON a.article_id = r.article_id
  LEFT OUTER JOIN comment c
    ON a.article_id = c.article_id
 GROUP BY a.article_id

Вот некоторые тестовые данные, с которыми можно поиграть:

-- Create tables
CREATE TABLE article(article_id INT)
CREATE TABLE review(review_id INT, article_id INT)
CREATE TABLE comment(comment_id INT, article_id INT)

-- Create some test data
INSERT INTO article SELECT 1
INSERT INTO article SELECT 2
INSERT INTO article SELECT 3

INSERT INTO review SELECT 10, 1
INSERT INTO review SELECT 20, 2
INSERT INTO review SELECT 30, 2
INSERT INTO review SELECT 40, 3
INSERT INTO review SELECT 50, 3
INSERT INTO review SELECT 60, 3

INSERT INTO comment SELECT 200, 1
INSERT INTO comment SELECT 300, 1
INSERT INTO comment SELECT 400, 2
INSERT INTO comment SELECT 500, 2
INSERT INTO comment SELECT 600, 3

ПослеВы значительно изменили свой вопрос, я полагаю, что этот запрос даст вам ответ:

SELECT u.content_type_id
       ,u.object_id
       ,review_count = SUM(u.review_count)
       ,comment_count = SUM(u.comment_count)
  FROM
    (
    SELECT content_type_id
           ,object_id
           ,review_count = COUNT(*)
           ,comment_count = 0
      FROM review
     GROUP BY content_type_id, object_id
     UNION
    SELECT content_type_id
           ,object_id
           ,review_count = 0
           ,comment_count = COUNT(*)
      FROM comment
     GROUP BY content_type_id, object_id
    ) u
GROUP BY u.content_type_id, u.object_id

А вот некоторые тестовые данные для работы:

CREATE TABLE review(review_id INT, content_type_id INT, object_id INT)
CREATE TABLE comment(comment_id INT, content_type_id INT, object_id INT)

INSERT INTO review SELECT 11, 10, 100
INSERT INTO review SELECT 12, 10, 100
INSERT INTO review SELECT 13, 20, 100
INSERT INTO review SELECT 13, 10, 200
INSERT INTO review SELECT 13, 30, 100
INSERT INTO comment SELECT 21, 10, 100
INSERT INTO comment SELECT 22, 20, 100
INSERT INTO comment SELECT 23, 20, 100
INSERT INTO comment SELECT 24, 20, 100
INSERT INTO comment SELECT 25, 10, 200
INSERT INTO comment SELECT 26, 10, 200
1 голос
/ 09 февраля 2012
select a.article_id,
    coalesce(rc.review_count, 0) as review_count,
    coalesce(cc.comment_count, 0) as comment_count
from articles a
left outer join (
    select article_id, count(*) as review_count
    from review
    group by article_id
) rc on a.article_id = rc.article_id
left outer join (
    select article_id, count(*) as comment_count
    from comments
    group by article_id
) cc on a.article_id = cc.article_id
1 голос
/ 09 февраля 2012

С макушки головы, но я думаю, что это сработает:

SELECT
article_id,
article_name,
count(review_id) as review_count,
count(comment_id) as comment_count
FROM articles a, reviews b, comments c
WHERE
a.article_id = b.article_id OR
a.article_id = c.article_id

Это относится только к статьям с обзорами и / или комментариями. Чтобы получить без использования левого соединения.

1 голос
/ 09 февраля 2012
SELECT article_id, article_name,
(
    select count(review_id)
    from review 
    where article_id = a.articles
) review_count,
(
   select count(comments _id)
    from comments 
    where article_id = a.articles
) comment_count
FROM articles a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...