Как ПРИСОЕДИНИТЬСЯ к КОЛИЧЕСТВУ от таблицы и затем эффекту, которые РАССЧИТЫВАЮТ с другим СОЕДИНЕНИЕМ

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

Сообщение

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
11
задан Brian Tompsett - 汤莱恩 27 May 2017 в 22:24
поделиться

3 ответа

Вы можете использовать вложенный 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

Примечание: Скорее всего, есть более элегантное решение, хотя!!!!

14
ответ дан 3 December 2019 в 05:57
поделиться
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 .

1
ответ дан 3 December 2019 в 05:57
поделиться

Из определения функции 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
5
ответ дан 3 December 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: