web-dev-qa-db-ja.com

INとサブクエリを使用したMYSQLUPDATE

こんにちは私はこのようなテーブルを持っています:

テーブルエントリ:

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

どんな助けでもありがたいです。

11
Johal

使用する:

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))
19
OMG Ponies

別のテーブルにtotal_commentsが本当に必要な場合は、それをVIEWにします。

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

このようにして、total_commentsテーブルを完全に更新するというメンテナンスタスクを回避できます。

3
mluebke

それはまさに私が期待することです。 IDは指定したセット内にあるため、total_comments = total_comments +1です。

同じ値のインスタンスごとに1つ追加することはありません。これは、INの動作方法ではありません。 INは、単純なブール値yes/noを返します。

1
Satanicpuppy

試してみてください:

UPDATE entry
  SET total_comments = (SELECT COUNT(*) 
                        FROM comments
                        WHERE entry.id = comments.eid
                        GROUP BY id)
1
VeeArr
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))
0
Johal