Обновить столбец с COUNT других полей - SQL?
Привет, ребята, у меня установлены следующие таблицы:
Articles:
ID | TITLE | CONTENT | USER | NUM_COMMENTS
COMMENTS
ID | ARTICLE_ID | TEXT
Мне нужна инструкция sql, которая обновляет поле NUM_Comments в таблице статей с количеством комментариев, сделанных против этой статьи, например:
update articles a, comments f
set a.num_comments = COUNT(f.`id`)
where f.article_id = a.id
Не удалось выполнить sql выше, и я получаю ошибку Invalid Use fo Group. Я использую MySQL здесь.
Ответы
Ответ 1
Вы не можете присоединиться к оператору обновления. Это должно быть
update articles
set num_comments =
(select count (*) from comments
where comments.article_id = articles.id)
Это обновит всю таблицу статей, которая может быть не такой, какой вы хотите. Если вы хотите обновить только одну статью, добавьте предложение "where" после подзапроса.
Ответ 2
Это должно работать.
UPDATE articles a SET num_comments =
(SELECT COUNT(*) FROM comments c WHERE c.article_id = a.id)
Но я предпочел бы обновлять только одну запись, если комментарий был отправлен:
UPDATE articles a SET num_comments =
(SELECT COUNT(*) FROM comments c WHERE c.article_id = 100) WHERE a.id = 100
Ответ 3
Чтобы обновить на основе только количества столбцов, вы можете сделать что-то вроде:
update articles,
(select count (*)
from comments
where comments.article_id = articles.id) as newtotals
set articles.num_comments = newtotals.count;
или... если у вас возникла ситуация, которая требовала подсчетов:
update articles,
(select (count (*)) + (articles.num_comments) as count
from comments
join articles on
comments.article_id = articles.id
group by articles.id) as newtotals
set articles.num_comments = newtotals.count;
Ответ 4
count (*) может иметь некоторые проблемы, особенно с пробелом между count и (*)...
так что работает sql на sqlite, pgsql будет:
update articles
set num_comments =
(select count(id) from comments
where comments.article_id = articles.id)
Ответ 5
вы не можете сделать это в общем внутреннем соединении. но вы можете сделать это по-другому:
1- Выберите все идентификаторы из таблицы статей
2- повторите их и выполните следующую команду
Обновить набор статей NUM_COMMENTS = (выберите count (id) из комментариев, где id = $id), где id = $id
чтобы увеличить его, в первом выборе не выбирайте все значения, особенно когда эта таблица слишком велика, вам нужно перебирать статьи и получать 1000 записей за итерацию. Таким образом, u будет поддерживать здоровые потоки БД из вашего пула БД, а также экономить пропускную способность.