Mysql - 使用 t2 行的计数更新 t1,其中两列与 t1 相同

标签 mysql sql

我有两个表 t1t2,并希望将 t1 作为输出,并添加一个列,给出 t2 中的行数,其中 (id, category)存在。

这是一个小数据集的例子:

CREATE TABLE IF NOT EXISTS `t1` (
  `key` int(11) NOT NULL,
  `id` int(11) NOT NULL,
  `category` int(11) NOT NULL,
  PRIMARY KEY (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `t1` (`key`, `id`, `category`) VALUES
(1, 12, 101),
(2, 12, 104),
(3, 13, 102),
(4, 14, 101),
(5, 15, 102);


CREATE TABLE IF NOT EXISTS `t2` (
  `key` int(11) NOT NULL,
  `id` int(11) NOT NULL,
  `category` int(11) NOT NULL,
  PRIMARY KEY (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `t2` (`key`, `id`, `category`) VALUES
(1, 12, 101),
(2, 12, 102),
(3, 13, 101),
(4, 13, 104),
(5, 12, 101),
(6, 15, 102);

这是我希望得到的输出,最后一列是所需的信息:

t1 updated
key, id, category, count_t2_id_category
1, 12, 101, 2     # because (12,101) appears 2 times in t2
2, 12, 104, 0     # because (12,104) appears 0 times in t2
3, 13, 102, 0     # etc
4, 14, 101, 0
5, 15, 102, 1

我尝试了以下命令作为开始,但它在输出中遗漏了一些 t1 行:

SELECT *
FROM t1
LEFT OUTER JOIN t2 ON t1.id=t2.id AND t1.category = t2.category
GROUP BY t1.id

输出缺少 t1 键#2:

key id  category    key id  category    
1   12  101 1   12  101 
3   13  102 NULL    NULL    NULL    
4   14  101 NULL    NULL    NULL    
5   15  102 6   15  102 

最佳答案

由于您希望非匹配行的值为零,因此它适用于 LEFT JOIN,例如:

SELECT 
  t1.*, 
  IF(t2.`key` IS NULL, 0, COUNT(t1.`key`)) AS t2_row_count 
FROM 
  t1 
    LEFT JOIN t2 
      ON t1.id=t2.id 
      AND 
      t1.category=t2.category 
GROUP BY 
  t1.`key`

我们正在计算 t1.key,因为对于匹配的行,它们在第一个 表(而不是第二个)中是相同的 - 因此,我们应该按它分组 - 并且不是按第二个表中的字段。

提示:避免使用 mysql 保留字命名您的表/列。如果您不小心忘记了反引号,这将为您节省很多时间。

关于Mysql - 使用 t2 行的计数更新 t1,其中两列与 t1 相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23490272/

相关文章:

sql - 确定 BLOB 的高度和宽度

mysql - SUBQUERY 用于汇总行

mysql - 连接2个表进行查看

mysql - 在另一个子查询的 WHERE IN 中使用子查询结果(优化)

php - 如果存在则删除该记录,否则插入

javascript - Postgres 相当于 MySQL 的 SET?

php - 用户/密码身份验证 PHP/MySQL - PHP 或 MySQL 查询中的比较?

php - 使用 PHP 插入 MySQL 数据库时排除空记录

sql - 计算 SQL 或 Pandas 中 GROUP BY 后的类别数

SQL Server 计算列的元数据