У меня есть три таблицы
Сообщение
ID Name
1 'Something'
2 'Something else'
3 'One more'
Комментарий
ID PostId ProfileID Comment
1 1 1 'Hi my name is'
2 2 2 'I like cakes'
3 3 3 'I hate cakes'
Профиль
ID Approved
1 1
2 0
3 1
Я хочу считать комментарии для сообщения, где профиль для комментария утвержден
Я могу выбрать данные из Сообщения и затем присоединиться к количеству из прекрасного Комментария. Но это количество должно зависеть от того, если Профиль утвержден или нет.
Результаты, которые я ожидаю,
CommentCount
PostId Count
1 1
2 0
3 1
Вы можете использовать вложенный select, как здесь:
SELECT Post.Id, temp.Count
FROM Post
LEFT JOIN
(SELECT Post.Id, COUNT(Comment.ID) AS Count
FROM Post
LEFT JOIN Comment ON Comment.PostId = Post.ID
LEFT JOIN Profile ON Profile.ID = Comment.ProfileID
WHERE Profile.Approved = 1
GROUP BY Post.Id)
temp ON temp.Id = Post.ID
Что даст вам null, где нет сообщений, а не отсутствие записей:
1 1
2 null
3 1
Чтобы улучшить это, вы можете использовать if, чтобы избавиться от нулей
SELECT Post.Id, if(temp.Count >= 1,temp.Count,0) as newCount
FROM Post
LEFT JOIN
(SELECT Post.Id, COUNT(Comment.ID) AS Count
FROM Post
LEFT JOIN Comment ON Comment.PostId = Post.ID
LEFT JOIN Profile ON Profile.ID = Comment.ProfileID
WHERE Profile.Approved = 1
GROUP BY Post.Id) temp ON temp.Id = Post.ID
Что даст вам то, что вы изначально хотели:
1 1
2 0
3 1
Примечание: Скорее всего, есть более элегантное решение, хотя!!!!
SELECT Post.Id, COUNT(Comment.ID) AS Count
FROM Post
LEFT JOIN Comment ON Comment.PostId = Post.ID
LEFT JOIN Profile ON Profile.ID = Comment.ProfileID
WHERE Profile.Approved = 1
GROUP BY Post.Id
Возможно, вы не вставляли его ради примера, но вы могли бы оценить, чтобы денормализовать Profile
вместе с таблицей Comment
, перемещая в ней столбец Approved
.
Из определения функции COUNT:
Функция COUNT будет считать только те записи, в которых поле в скобках является NOT NULL.
Это означает, что сработает простое внешнее объединение типа такого:
SELECT Post.ID, COUNT(Comment.ID)
FROM Post LEFT JOIN Comment ON (Post.ID = Comment.PostId)
LEFT JOIN Profile ON (Profile.ID = Comment.ProfileID AND
Profile.Approved = 1)
GROUP BY Post.ID