Подтвердить что ты не робот

Обновить столбец с 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 здесь.

4b9b3361

Ответ 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 будет поддерживать здоровые потоки БД из вашего пула БД, а также экономить пропускную способность.