2010-06-07 143 views
7

嗨,我有一個像這樣的表: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

任何幫助將不勝感激。

回答

14

用途:

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

1

這正是我所期望的。該ID是你給它的集合,所以total_comments = total_comments + 1.

它不會爲同一個值的每個實例添加一個:這不是如何工作。 IN將返回一個簡單的布爾是/否。

+0

我知道......但我想一些方法,使我可以在subqery算entry.id的數量。 我可以通過運行子查詢sperate,然後使用for循環運行更新查詢來完成所有這些操作。但我想在一個查詢這是我的porblem :( – Johal 2010-06-08 14:39:32

1

嘗試:

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

3

如果你真的需要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

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