根据另一个表的聚合更新表

时间:2015-05-28 15:14:16

标签: mysql sql aggregation

我有一张像这样的表t1

Names    Drug 

Tom      A
Tom      A
Tom      B
Lily     B
Lily     B

和表格t2是这样的:

Names    Drug   COUNT(Drug)

Tom      A
Tom      B
Tom      C
Lily     A
Lily     B

我希望在按药物和名称分组后,将t1中的数据插入t2的COUNT(drug)列。 t2的期望输出如下:

Names    Drug   COUNT(Drug)

Tom      A      2
Tom      B      1
Tom      C      0
Lily     A      0
Lily     B      2

我正在考虑使用t3中的GROUP BY drug, name数据创建另一个表格t1,然后根据t2更新t3,但现在很有时间 - 耗时。

2 个答案:

答案 0 :(得分:2)

任何时候你都遇到这样一个复杂的问题,你应该总是尝试将它分解成可以解决的小块,并将它们重新组合在一起。

例如,我首先从第一个表中获取名称/药物计数,如下所示:

SELECT name, drug, COUNT(*) AS numDrugs
FROM t1
GROUP BY name, drug;

然后,在通过在名称和药物匹配的条件下连接两个表来更新t2时,可以将其用作子查询。您应该使用leftjoin和coalesce函数来替换0不存在的值:

UPDATE t2
LEFT JOIN(
  SELECT name, drug, COUNT(*) AS numDrugs
  FROM t1
  GROUP BY name, drug) t1 ON t1.name = t2.name AND t1.drug = t2.drug
SET drugCount = COALESCE(numDrugs, 0);

以下是SQL Fiddle示例。

答案 1 :(得分:2)

我认为这个问题可以帮助您:specific mysql update based on group by data

您可以这样做:

UPDATE t2
LEFT JOIN
(
   SELECT name, drug, count(*) num
   FROM t1 
   GROUP BY name, drug
) r ON  t2.name = r.name AND t2.drug = r.drug 
SET t2.count_drag = COALESCE(r.num, 0);