MYSQL使用IN和子查询进行更新

16

嗨,我有类似这样的表:

表入口:

id | total_comments
_____________________
1 | 0
2 | 0
3 | 0
4 | 0

评论表:

id | eid | 评论
_____________________
1 | 1 | 评论 sdfd
2 | 1 | 测试测试
3 | 1 | 评论文本
4 | 2 | 虚拟评论
5 | 2 | 示例评论
6 | 1 | fg fgh dfh

我编写的查询语句为:

UPDATE entry 
   SET total_comments = total_comments + 1 
 WHERE id IN ( SELECT eid 
                 FROM comments 
                WHERE id IN (1,2,3,4,5,6))

我得到的结果是:

表格条目:

id | total_comments
_____________________
1 | 1
2 | 1
3 | 0
4 | 0

期望的结果是:

表格条目:

id | total_comments
_____________________
1 | 4
2 | 2
3 | 0
4 | 0

将不胜感激地接受任何帮助。

5个回答

22

使用:

UPDATE entry 
   SET total_comments = (SELECT COUNT(*)
                           FROM COMMENTS c
                          WHERE c.eid = id
                       GROUP BY c.eid)
 WHERE id IN ( SELECT eid 
                 FROM comments 
                WHERE id IN (1,2,3,4,5,6))

是的,我正在寻找这样的东西……我的目标是基于子查询运行更新查询……用“entry”表中实际评论数更新“total_comments”,针对“entry”中的ID。如果我运行指定的查询,它只会为子查询中找到的所有评论数添加1。在子查询运行后,以下SQL查询变成了这个样子:UPDATE entry SET total_comments = total_comments + 1 WHERE id IN (1,1,1,2,2,1)因此,在entry表中,更新仅运行一次1和2 id。因为这是IN的工作方式。但是我想以某种方式使其4次运行1次,2次运行2次。 - Johal
我认为唯一的方法是运行子查询,类似于我不知道如何做的:UPDATE entry SET total_comments = total_comments + @count WHERE id IN ( SELECT eid, count(*) as @count FROM comments WHERE id IN (1,2,3,4,5,6))但是由于多行的原因,In操作符无法正常工作,而且我也不知道如何在设置条件中引用@count :( - Johal

3
如果你真的需要将total_comments单独存储在一个表中,我建议将其作为视图来创建。
CREATE VIEW entry AS 
  SELECT id, COUNT(comments) AS total_comment 
  FROM comments 
  GROUP BY id

通过这种方式,您可以完全避免更新 total_comments 表的维护任务。


+1:我完全同意,这比当前的表结构是更好的设计选择。 - OMG Ponies

1

尝试:

UPDATE entry
  SET total_comments = (SELECT COUNT(*) 
                        FROM comments
                        WHERE entry.id = comments.eid
                        GROUP BY id)

这将运行条目表中的所有记录,但我只想运行特定的记录,因此我使用了IN子句... - Johal

1

这正是我所期望的。ID在你给定的集合中,因此total_comments = total_comments + 1。

它不会为相同值的每个实例添加一个:这不是IN的工作方式。IN将返回一个简单的布尔值。


我知道...但我想要一些方法来计算子查询中entry.id的数量。我可以通过运行单独的子查询,然后使用for循环运行更新查询来完成。但我想在一个查询中完成这个操作,这就是我的问题 :( - Johal

0
UPDATE entry e 
    SET total_comments = ( SELECT COUNT(*) FROM comments WHERE eid = e.id)  
    WHERE 
    e.id in (SELECT eid FROM comments WHERE id IN (1,2,3,4,5,6))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接