【问题标题】:I can't seem to combine 2 tables in MySQL using LEFT JOIN我似乎无法使用 LEFT JOIN 在 MySQL 中组合 2 个表
【发布时间】:2020-12-11 15:31:03
【问题描述】:

我有 2 个表格,我需要从一个概览中获得结果。 这是使用 MySQL 5.5.44 完成的

表 1

id(PK) medewerker(VARCHAR) klantnummer(INT) datum(DATE) tijd(TIME) actief(TINYINT)
1 John Doe 12345 1-1-2020 10:00:01 1
2 Jane Doe 12345 1-1-2020 10:00:01 1
3 John Doe 12345 1-1-2020 10:00:01 1
4 John Doe 12345 1-1-2020 10:00:01 1

表 2

id(PK) medewerker(VARCHAR) reden(VARCHAR) waarde(INT) datum(DATE) tijd(TIME) actief(TINYINT)
1 John Doe Error -33 1-1-2020 10:00:01 1
2 Jane Doe Vacation 110 1-1-2020 10:00:01 1
3 John Doe Test 10 1-1-2020 10:00:01 1
4 John Doe Check 40 1-1-2020 10:00:01 1

现在我想计算每个员工在表 1 中可见的次数,所以通常我会这样做。

SELECT `medewerker` `Employee`,count(`medewerker`) `Total` FROM bb.aa group by `medewerker`
Employee Total
John Doe 3
Jane Doe 1

我还需要表 2 中“waarde”的总和。

SELECT `medewerker` `Employee`,sum(waarde) `ExtraValue` FROM bb.bb GROUP BY `medewerker`
Employee ExtraValue
John Doe 17
Jane Doe 110

这两张桌子需要放在一起并合二为一。也有可能员工确实存在于表 1 中但不存在于表 2 中,反之亦然。 确定这是否会导致问题。但我不确定如何执行此操作,我似乎无法理解我需要如何使用 LEFT JOIN。

要明确这就是我想要的。

Employee Total ExtraValue
John Doe 3 17
John Doe 1 110

我试图根据我在互联网上找到的东西做这样的事情,但这不起作用并且给出了超时,因为我在实时数据上进行了尝试。生成它的时间超过 30 秒。

SELECT aa.medewerker, count(aa.medewerker),sum(bb.waarde) 
FROM aa.aa  LEFT JOIN aa.bb 
ON bb.medewerker = aa.medewerker 
group by aa.medewerker 


CREATE TABLE IF NOT EXISTS `aa`.`bb` (
  `idBonusVermindering` INT(11) NOT NULL AUTO_INCREMENT,
  `medewerker` VARCHAR(80) NOT NULL,
  `reden` VARCHAR(500) NOT NULL,
  `datum` DATE NOT NULL,
  `tijd` TIME NOT NULL,
  `waarde` INT(11) NOT NULL DEFAULT '-1',
  PRIMARY KEY (`idBonusVermindering`),
  UNIQUE INDEX `idBonusVermindering_UNIQUE` (`idBonusVermindering` ASC) VISIBLE)
ENGINE = InnoDB
AUTO_INCREMENT = 646
DEFAULT CHARACTER SET = latin1

CREATE TABLE IF NOT EXISTS `aa`.`aa` (
  `medewerker` VARCHAR(45) NOT NULL,
  `klantnummer` INT(11) NOT NULL,
  `datum` VARCHAR(15) NOT NULL,
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `Actief` TINYINT(1) NOT NULL DEFAULT '1',
  `tijd` TIME NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `id_UNIQUE` (`id` ASC) VISIBLE)
ENGINE = InnoDB
AUTO_INCREMENT = 210502
DEFAULT CHARACTER SET = latin1

【问题讨论】:

  • 你的MySql是什么版本的?
  • MySQL 5.5.44 是我正在运行的版本
  • 对一个人的名字进行分组并不是一个好主意。那应该是名称的主表,因此您有适当的 PK / FK。在美国,如果你有一个像“John Smith”这样的名字,你可能有 100 个不同的实例,因此计数结果很差。看看你是否可以更新你的数据库规范化来解决它,如果不是现在,在这成为一个更大的问题之前不久。
  • @DRapp 谢谢你的回答,这些东西从来没有打算这样使用。这个旧代码带有更糟糕的数据库。在我们推出新系统之前,我只需要再做几个月的工作。新系统到处都使用 user_id。

标签: mysql


【解决方案1】:

您的查询需要FULL 外连接,MySql 不支持,只能由 2 个单独查询的UNION ALL 模拟:

SELECT q1.Employee, q1.Total, COALESCE(q2.ExtraValue, 0) ExtraValue 
FROM (SELECT medewerker Employee, COUNT(*) Total FROM aa GROUP BY Employee) q1
LEFT JOIN (SELECT medewerker Employee, SUM(waarde) ExtraValue FROM bb GROUP BY medewerker) q2 
ON q1.Employee = q2.Employee
UNION ALL
SELECT q2.Employee, COALESCE(q1.Total, 0) Total, q2.ExtraValue 
FROM (SELECT medewerker Employee, COUNT(*) Total FROM aa GROUP BY Employee) q1
RIGHT JOIN (SELECT medewerker Employee, SUM(waarde) ExtraValue FROM bb GROUP BY medewerker) q2 
ON q1.Employee = q2.Employee
WHERE q1.Employee IS NULL

请参阅demo
结果:

> Employee | Total | ExtraValue
> :------- | ----: | ---------:
> Jane Doe |     1 |        110
> John Doe |     3 |         17

【讨论】:

  • 就是这样,所以我的问题是我需要完全加入。 MySQL 不支持。谢谢您的帮助!我一直在努力解决这个问题啊哈哈哈
  • @JeffreyLionelvanHoudt 也是你的 MySQL 版本,它已经很老了。在最新版本 8.0+ 中,可以使用 CTE 编写查询,这样可以减少冗长,提高效率。
  • 这是一个旧服务器,有一些我们不想接触的旧代码,我们只需要它运行几个月,直到我们安装新系统。新系统使用 MySQL 8.0 运行,最后使用 C# 使用 .net 5 而不是使用框架 3.5 的 vb.net
猜你喜欢
  • 2012-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
相关资源
最近更新 更多