MYSQL UPDATE与和子查询

问题描述:

嗨,我有一个像这样的表:MYSQL UPDATE与和子查询

表项:

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

任何帮助将不胜感激。

用途:

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)) 
+0

是的,我正在寻找类似的东西...我的动机是运行基于子查询的更新查询....其更新“entry”表中的“total_comments”与acutal “条目”中的ID 如果我运行查询,我已经指定它只会为子查询中发现的所有数量的子数增加1.在子查询运行后,sql查询变成什么样子: UPDATE条目 SET total_comments = total_comments + 1 WHERE id IN(1,1,1,2,2,1) 因此更新只对入口表中的1和2个ID运行一次。因为它如何工作。但我想要一些如何运行4次1和2次为2. – Johal 2010-06-08 14:28:12

+0

唯一的办法,我认为是运行子查询这样的事情,我不知道该怎么办: UPDATE条目 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)) 但是然后在Innt不工作因为多行和我也不知道如何在设置条件中提到@count :( – Johal 2010-06-08 14:30:43

这正是我所期望的。该ID是你给它的集合,所以total_comments = total_comments + 1.

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

+0

我知道......但我想一些方法,使我可以在subqery算entry.id的数量。 我可以通过运行子查询sperate,然后使用for循环运行更新查询来完成所有这些操作。但我想在一个查询这是我的porblem :( – Johal 2010-06-08 14:39:32

尝试:

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

这将运行在入口表中的所有记录,但我想运行只有指定的记录这就是为什么我用IN子句... – Johal 2010-06-08 14:37:07

如果你真的需要TOTAL_COMMENTS在一个单独的表,我会作出这样的景色。

CREATE VIEW entry AS 
    SELECT id, COUNT(comments) AS total_comment 
    FROM comments 
    GROUP BY id 

这样可以避免完全更新total_comments表的维护任务。

+0

+1:我完全同意,这是一个比当前表结构更好的设计选择 – 2010-06-07 21:14:02

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))