Vraag Een kolom bijwerken met een COUNT andere velden is SQL?


Hallo allemaal, ik heb de volgende tabellen ingesteld:

Articles:
ID | TITLE | CONTENT | USER | NUM_COMMENTS

COMMENTS
ID | ARTICLE_ID | TEXT

Ik heb een sql-instructie nodig die het NUM_Comments-veld van de artikeltabel bijwerkt met het aantal reacties op het artikel, zoals:

update articles a, comments f 
set a.num_comments =  COUNT(f.`id`)
where f.article_id = a.id

De sql hierboven werkt niet en ik krijg een ongeldig gebruik voor Group-functiefout. Ik gebruik hier MySQL.


14
2018-05-26 07:39


oorsprong


antwoorden:


U kunt niet deelnemen aan een updateverklaring. Het zou moeten zijn

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

Hiermee wordt de hele artikeltabel bijgewerkt, die misschien niet is wat u zoekt. Als u slechts één artikel wilt bijwerken, voegt u een 'where'-clausule toe na de subquery.


29
2018-05-26 07:43



Dit zou moeten werken.

UPDATE articles a SET num_comments = 
(SELECT COUNT(*) FROM comments c WHERE c.article_id = a.id)

Maar ik zou liever slechts één record bijwerken wanneer er een reactie is geplaatst:

UPDATE articles a SET num_comments = 
(SELECT COUNT(*) FROM comments c WHERE c.article_id = 100) WHERE a.id = 100

8
2018-05-26 07:43



Als u alleen wilt updaten op basis van een kolomtelling, kunt u iets doen als:

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

of ... als u een situatie had waarbij rollende tellingen nodig waren:

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
2017-08-24 06:02



je kunt het niet op een generieke inner join-manier doen. maar je kunt het op een andere manier doen door:

1- Selecteer alle id's uit de tabel met artikelen

2- itereer ze en voer de volgende opdracht uit

update artikelen set NUM_COMMENTS = (selecteer count (id) uit reacties waarbij id = $ id) waarbij id = $ id

om het meer te verbeteren, selecteert u in de 1e selectie niet alle waarden, vooral wanneer die tabel te groot is, moet u de artikelen herhalen en 1000 records per iteratie krijgen. Op deze manier behoudt u een gezonde DB-thread uit uw DB-pool en bespaart u ook bandbreedte.


-2
2018-05-26 07:51