【发布时间】: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