Обновить столбец с COUNT других полей SQL? - PullRequest
19 голосов
/ 26 мая 2011

Привет, ребята. У меня есть следующие таблицы:

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 function. Я использую MySQL Здесь.

Ответы [ 5 ]

34 голосов
/ 26 мая 2011

Вы не можете присоединиться к заявлению на обновление. Должно быть

update articles
set num_comments =
(select count (*) from comments
where comments.article_id = articles.id)

Это обновит всю таблицу статей, которая может не соответствовать вашим ожиданиям. Если вы намереваетесь обновить только одну статью, добавьте предложение 'where' после подзапроса.

8 голосов
/ 26 мая 2011

Это должно работать.

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
0 голосов
/ 16 ноября 2018

count (*) может иметь некоторые проблемы, особенно с пробелом между count и (*) ...

, поэтому при работе sql на sqlite pgsql будет:

update articles 
  set num_comments = 
    (select count(id) from comments 
     where comments.article_id = articles.id)
0 голосов
/ 24 августа 2016

Чтобы обновить на основе только количества столбцов, вы можете сделать что-то вроде:

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;
0 голосов
/ 26 мая 2011

вы не можете сделать это обычным способом внутреннего соединения. но вы можете сделать это по-другому:

1- Выберите все идентификаторы из таблицы статей

2 - итерируйте их и выполните следующую команду

обновить набор статей NUM_COMMENTS = (выбрать количество (id) из комментариев, где id = $ id), где id = $ id

чтобы еще больше его улучшить, при первом выборе не выбирайте все значения, особенно если эта таблица слишком велика, вам нужно перебирать статьи и получать 1000 записей за итерацию. Таким образом, вы будете поддерживать работоспособные потоки БД из вашего пула БД, а также сэкономите пропускную способность.

...