2015-04-14 6 views
0

У меня есть следующие структуры таблицы:SQL Server INNER JOIN с тремя таблицами

Новости (Id_news, news_name)

Комментарии (Id_comment (PK), Id_news (FK), комментарий)

Ответов (Id_Reply (PK), Id_Comment (ФК), ответ)


Я хочу получить количество ответов на комментарии в новостях.

Это вопрос, который я пробовал.

SELECT COUNT(*) 
FROM (News INNER JOIN Comments ON News.Id_news = Commnets.Id_Comment) 
INNER JOIN Reply ON Commnets.Id_Comment = Reply.Id_Comment 
WHERE News.Id_news = {0} 

Это это следующая ситуация: У меня есть веб-страницы с большим количеством новостей, но не все новости есть комментарии и не все комментарии есть ответы. Поэтому мне нужно подсчитать, есть ли какой-либо ответ в конкретных новостях (например, Id_news = 43), чтобы запускать один код.

ответ

4

Как вы уже упомянули, что вы хотите иметь количество ответов на какой-либо конкретной новости, которые могут иметь или не иметь каких-либо комментариев или ответ. Вот моя попытка

SELECT COUNT(Replys.Id_Reply) 
FROM NEWS 
LEFT JOIN Coments ON Coments.ID_News = Coments.Id_News AND NEWS.Id_News = {0} 
LEFT JOIN Replys ON Replys.Id_Comment = Coments.Id_Comment 

Пример кода попробовать

CREATE TABLE NEWS (Id_news INT, news_name varchar(10)) 
CREATE TABLE Coments (Id_comment INT,Id_news INT, comment varchar(10)) 
CREATE TABLE Replys(Id_Reply INT, Id_Comment INT , reply varchar(10)) 

INSERT INTO NEWS VALUES (1,'News1'), (2, 'News2'), (3,'News3') 
INSERT INTO Coments VALUES (1,1,'Comment1'), (2,1,'Comment2'), (3,2,'Comment3') 
INSERT INTO Replys VALUES (1,1,'Reply1'),(2,3,'Reply2'), (3,3,'Reply3') 

запрос:

DECLARE @NewId INT = 2 
SELECT COUNT(Id_Reply) 
FROM NEWS N 
LEFT JOIN Coments C ON C.ID_News = N.Id_News AND N.Id_News = @NewId 
LEFT JOIN Replys R ON R.Id_Comment = C.Id_Comment 

Проверка на SQL Fiddle

+0

Это то, что мне нужно, спасибо. Ответ принят. – Veslor

+0

@ Veslor Рад, что это помогло! :) – Zerotoinfinity

+0

После выполнения некоторых тестов этот счет подсчитывает каждый ответ в каждой новости. У меня есть 3 разных новости с 3 разными комментариями и ответами, и я возвращаю мне 9, а не 3. – Veslor

0

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

SELECT News.Id_news,COUNT(*) 
FROM News 
JOIN Comments 
    ON News.Id_news = Commnets.Id_news 
JOIN Reply  
    ON Commnets.Id_Comment = Reply.Id_Comment 
WHERE News.Id_news = {0} 
group by News.Id_news,Commnets.Id_Comment 
+0

Синтаксис ошибки, переместить запятую первой линии. – jarlh

+0

thank's @jarlh ....... –

+0

Я попробую, дайте мне минуту. Спасибо за ответ. – Veslor

0

Я думаю, что Вы присоединились к неправильному идентификатору в вашем первой JOIN. Попробуйте

SELECT 
    COUNT(*) 
FROM 
    News JOIN Comments ON News.Id_news = Commnets.Id_news 
     JOIN Reply ON Commnets.Id_Comment = Reply.Id_Comment 
WHERE 
    News.Id_news = {0} 
Смежные вопросы