1

の行数を取得し、その数をフィールドごとに一時テーブルにtableAグループ化するクエリを作成しました。次に、テーブルのフィールドがフィールドの値と同じである場合、そのフィールドの値をテーブルの 値に変更することによってオンになります。set_idcUPDATEtableBcurrent_countccountcountcset_idcurrent_countset_id

UPDATE sets, (
  SELECT
    set_id, 
    COUNT(set_id) AS count
  FROM leads_auto
  GROUP BY set_id
) c 
SET sets.current_count = c.count
WHERE sets.set_id = c.set_id

このクエリの欠点は、 'sのテーブルにカウントが存在しないUPDATE tableB場合、current_count値をゼロにすることができないことです。ctableBset_id

私はこれを試しました

UPDATE sets, (
  SELECT
    set_id,
    COUNT(set_id) AS count
  FROM leads_auto
  GROUP BY set_id
) d
SET sets.current_count = 0 
WHERE sets.set_id != d.set_id

ただし、テーブルがinを含む行を返し、に存在するいくつかの'を除外しても、上の行には影響しませんtableBcset_idtableBset_idtableB

誰もがこれを達成する方法を知っていますか?

SELECT set_id, COUNT(set_id) AS count FROM leads_auto GROUP BY set_id

戻り値

set_id |   count
-------+---------
     1 |       7
     5 |       5
     4 |      16
     7 | 2000000
4

1 に答える 1

2

WHERE節は事実INNER JOIN上:

WHERE sets.set_id = c.set_id

両方のテーブルに存在する行のみを返します。クエリをに変換して、一致するものが見つからない場合に右側のテーブルの値LEFT JOINを返します。NULL

UPDATE sets AS s
LEFT JOIN (
  SELECT
   set_id,
   COUNT(set_id) as cnt 
  FROM leads_auto 
  GROUP BY set_id
) d
ON s.set_id = d.set_id
SET s.current_count = COALESCE(d.cnt, 0)
于 2012-10-07T08:16:36.373 に答える