1

我进行了一个查询,该查询获取行数tableA并将按字段的计数分组set_id到临时表中c。然后,如果table 中的字段与字段的值相同,它会通过将其字段的值更改为 table 的值来执行 UPDATEon 。tableBcurrent_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

但它不会影响任何行tableB即使 tablec返回带有set_idin 的行tableB并排除了一些set_id确实存在于的行tableB

有谁知道如何做到这一点?

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

它只返回两个表中都存在的行。当未找到匹配项时,将查询转换为 aLEFT 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 回答