2012-02-19 4 views
1

У меня есть 2 таблицы для статей, а вторая для комментариев, теперь я хочу получить общее количество комментариев и всех статей с помощью 1 запроса, я не хочу использовать 2 запрашивает один отдельно для деталей статьи и один для комментариев, может кто-то, пожалуйста, помогите мне получить общее количество комментариев по конкретной статье и ко всем ее комментариям.mysql запрос, чтобы получить общее количество комментариев к статье

таблица статей ... article_id таблица комментариев .... comment_id, comment_article_id

нормально, чтобы получить комментарии, которые я так SELECT COUNT (*) в общей сложности ....

теперь я хочу, чтобы получить как вещь (полные статьи деталь из article_id) и от комментариев таблицы Общего количества комментариев (и если возможно все комментарии подробности по этой статье ID) с помощью одного запроса ...

С уважением

ответ

6

Чтобы получить подробную статью и количество комментариев вы можете использовать следующие

SELECT 
    articles.*, 
    COALESCE(COUNT(comments.comment_id),0) AS numberOfCommments 

FROM articles 
LEFT JOIN comments 
ON comments.comment_article_id = articles.article_id 
AND comments.comment_type = 'B' 

// If selecting a specific article use this line 
WHERE articles.article_id = [[ARTICLE_ID]] 

// If selecting all articles with counts use this line 
GROUP BY articles.article_id 

Вы не можете получить информацию о комментариях в том же запросе, что и таблица статей, из-за того, что у двух, скорее всего, будут разные поля. Если вы действительно хотели бы получить статью, за которой последуют все комментарии, тогда будет работать что-то вроде следующего. Следуя ниже, убедитесь, что столбцы в первом запросе совпадают с столбцами во втором (т. Е. Столбец заголовка из статьи соответствует либо пустой строке (показано), либо столбцу заголовка из комментариев). Я бы лично не сделал этого, и вместо этого просто выполнил бы 2 запроса, один, чтобы получить детали статьи, и один, чтобы получить какие-либо комментарии таким образом, что не имеет значения, что типы столбцов могут не совпадать, а это также означает статьи запрос не нужно присоединиться на комментарии, как вы можете просто посчитать количество строк, которые в запросе комментариев

одного запроса метод союза, не советовали

(
    SELECT 
     'article' AS rowType, 
     article_date_posted, 
     article_title, 
     article_content 
    FROM articles 
    WHERE article_id = [[ARTICLE_ID]] 
) 
UNION 
(
    SELECT 
     'comment' AS rowType, 
     comment_date_posted, 
     '', // Empty string because comments usually have no title 
     comment_content 
    FROM comments 
    WHERE comment_article_id = [[ARTICLE_ID]] 
    AND comment_type = 'B' 
    ORDER BY comment_date_posted ASC 
) 

метод 2-запрос, проще и в большинстве случаев более эффективным

//articles query 
SELECT * 
FROM articles 
WHERE article_id = [[ARTICLE_ID]]; 

//comments query 
SELECT * 
FROM comments 
WHERE comment_article_id = [[ARTICLE_ID]] 
AND comment_type = 'B'; 
+0

Спасибо всем за ваше время, я очень ценю ..Симон, последний вопрос, проблема в том, что у меня alos есть comment_types, потому что таблица комментариев является общей, что означает, что я могу использовать таблицу комментариев для pics, videos, articles и т. Д., Теперь мне нужно только получить в случае ARTICLES, где comment_type = 'B' и в этом случае он не работает, и даже если он работает, он отображает только те статьи, у которых есть комментарии, если есть 0 комментариев, статья не показана, я попробовал суб-запрос, но это, похоже, не работает, поскольку я недостаточно хорош в том числе. Ваш вход будет оценен очень высоко ... – Max

+0

Я добавил несколько комментариев, которые должны делать по вашему запросу. В первом случае, если комментариев нет, будет показано количество комментариев = 0. Во втором и третьем он выберет статью, а затем любые комментарии, имеющие тип = 'B'. В каждом случае вам просто нужно указать ограничение comment_type = 'B' либо на критерии WHERE (при выборе из комментариев), либо на критерии JOIN ON ..., когда вы хотите подсчитать строки с определенным типом комментариев –

+0

как шарм :) спасибо, я учусь ... большое спасибо .. – Max

2

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

SELECT 
    COUNT(comment.comment_id) AS commentCount, 
    article.* 
FROM article 
LEFT JOIN comment ON article.article_id = comment.comment_article_id 
GROUP BY article.article_id 
+0

Вы не должны RIGHT JOIN (article-> комментарий ... 1 -> *)? – DerShodan

+0

Статья всегда будет существовать, комментарии не будут. Он указал статью в левой части соединения, и поэтому соединение LEFT верное. –

+0

Если вы хотите, чтобы детали комментариев, такие как текстовое содержимое, вы могли даже использовать ['GROUP_CONCAT'] (http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat) –

1
select count(*),comment_details 
from comments INNER JOIN articles 
where a.article_id = c.comment_article_id 
group by a.article_id; 
+0

это самый быстрый с точки зрения исполнения. Я использую тот же метод для простых операций, подобных этому. –

+0

@OliverMGrech Спасибо. –

Смежные вопросы