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

标签 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

我正在考虑使用 t1 中的 GROUP BY drug, name 数据创建另一个表 t3,然后更新 t2 基于 t3 但它非常耗时。

最佳答案

任何时候遇到像这样的复杂问题,您都应该尝试将其分解成您可以解决的更小的部分,然后将它们重新组合起来。

例如,我会像这样从第一个表中获取名称/药物计数:

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

然后,您可以在更新 t2 时将其用作子查询,方法是在 name 和 drug 匹配的条件下连接两个表。您应该使用 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示例。

关于mysql - 根据另一个表的聚合更新表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30510567/

相关文章:

mysql - 组中的行编号不正确

mysql - 如何在MYSQL的更新语句中使用Substring_Index

routes - SAPUI5 路由 - 无法找到 ID 为 idAppControl 的控件

mysql - 使用内部连接更新多个表

MySQL:将分组数据连接到表 - 仅连接第一行

sql - 使用同一个 SQL 表的一对多关系

sql - Oracle如何计算在plsql block 中插入的总行数

elasticsearch - 如何有效地只获取文档的一个字段进行 Elasticsearch

mongodb - 使用 MongoDB 按多个值进行 Golang 聚合组

mysql - SQL触发器的使用